Istifadəçi |
2012-06-08 01:07 GMT |
|
|
|
Pr0grammer |
|
Mesaj Sayı : 1677 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 62 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : KARABAKH IS AZERBAIJAN! |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
Təşəkkürlər && Respect bro endirirəm
edit:
Təşəkkürlər bir daha bro Əməyə Hörmət Əziyyət çəkmisən:
Əsas 1 təhlükəli vuln var burda 2 maraqlı səbəbdən:
1-ci səbəb $_POST['id']; client tərəfdir və sanitized olmamış vəziyyətdə query-dədir.(Blind SQL injectionumuz var burda)
2-ci səbəb isə vulnu təkcə adminin deyil eynilə sistemə avtorizə olunmamış userlərin belə etməsinə imkan verir çünki function.php sessiyanı burada yoxlamır.
Ən azından DOS üçün istifadə oluna bilər ən uzağı da passı responce time-lara görə brute etmək üçün.
Kod: //conf/function.php
case "mesajsil";
$cid = $_POST['id'];
$sil = mysql_query("delete from mesajlar where id='$cid'");
break;
Kod: Host: 192.168.0.15
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 17
Cookie: ASPX=blab blab blab
Pragma: no-cache
Cache-Control: no-cache
POSTDATA:
tip=mesajsil&id=6' or id=(select if(substr(password,1,1)='7',benchmark(10000000000000,md5(now())),0) from users where id=1) AND '1'!='2
MYSQL-də vəziyyət o anda:
Kod: mysql> show processlist \G
*************************** 1. row ***************************
Id: 16
User: mailuser
Host: worker.com:1029
db: hmail
Command: Sleep
Time: 25694
State:
Info: NULL
*************************** 2. row ***************************
Id: 17
User: mailuser
Host: worker.com:1030
db: hmail
Command: Sleep
Time: 3
State:
Info: NULL
*************************** 3. row ***************************
Id: 3693
User: root
Host: localhost:4800
db: ajaxchat1
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 4. row ***************************
Id: 3696
User: ajaxchat1
Host: worker.com:1980
db: ajaxchat1
Command: Query
Time: 14
State: Sending data
Info: delete from mesajlar where id='6' or id=(select if(substr(password,1,1)='7',benchmark(10000000000000
4 rows in set (0.00 sec)
mysql>
Bir də əsas bir neçə momenti deyim fikir verdim sessiyanı və $_SERVER['REMOTE_ADDR']-i də sanitize etmirsən.Heç vaxt etibar etmə
məsələn attacker HTTP_X_FORWARDED_FOR göndərə bilər o da elə variabledirki nəyə istəsən dəyişdirmək olur.
yenə də sql injection çıxacaq ortaya.Amma ki bu server side dependabledir yəni hər hostda alınmır.(byethost.com buna vulnerabledir)
Sessiya da həmçinin...Məsələn session.save_path ümumi /tmp/ dirsə attacker inject edə bilər ona çerez ordan da SQLinj gedə bilər.
Düzdür biraz mazaxist attack olacaq amma yenə də risk var.
Ümumiyyətlə çalış client tərəfdən nə gəlirsə ağına qarasına baxma sanitizasiya+validasiya elə.
Bir də bbc() funksiyası barədə orda str_replace() istifadə etmisən onu str_ireplace() ilə əvəzləsən daha gözəl olar söyüşü filanı Soyus kimi kimsə yazsa o halda da qarşısını alacaq.Yəni case insensitive daha gözəl olar.
Respect
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-06-08 10:42 GMT |
|
|
|
Admin |
|
Mesaj Sayı : 1875 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 45 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : Anti-armenia.ORG |
Ölkə : |
Məslək : Programmer & Defacer |
Yaş : 12 |
Mesaj : |
|
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-06-08 11:21 GMT |
|
|
|
İstifadəçi |
|
Mesaj Sayı : 85 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 0 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : |
Ölkə : |
Məslək : Avara Tələbə |
Yaş : |
Mesaj : |
|
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-06-08 18:32 GMT |
|
|
|
Pr0grammer |
|
Mesaj Sayı : 1677 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 62 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : KARABAKH IS AZERBAIJAN! |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
Sorry bro indi gördüm V2-ni axşam onu da test edəcəyəm.
Aşağıdakı qeydlər V1-ə aiddir.
//main.php
Kod: <?php
ob_start();session_start();
include("./conf/config.php");
include("./conf/function.php");
$session_user=$_SESSION['username'];
if(empty($_SESSION['hesab'])){header("location:index.php");}
##############################################################
## Coded by CAMOUFL4G3 ##
## 01.07.2012
## Respect to all brothers ##
##############################################################
?>
Buradakı:
Kod: if(empty($_SESSION['hesab'])){header("location:index.php");}
(aka inline coding) özü də problem yaradacaq.Çünki header() sadəcə olaraq HTTP Move 302 verəcək əslində isə skript hələ də işini
davam etdirir və nəticədə avtorizasiya etməmiş user xüsusi xmlhttprequestlər göndərməklə chatda yazı yaza bilərdi
(Potensial olaraq)
Yəni request asanlıqla buna toxunacaq və nəticədə yazı yaza bilər chatda qeydiyyatsız bir adam.
Kod: <script type="text/javascript">
document.onkeydown = gonder;
function gonder(x){
var button ;
button = x.which;
if(button == 13){
$("textarea[name=mesaj]").attr("disabled","disabled");
var mesaj = $("textarea[name=mesaj]").val();
$.ajax({
type:"POST",
url:"./conf/function.php",
data:{"tip":"gonder","mesaj":mesaj},
success:function(netice){
if(netice =="bos"){
alert("Boş mesaj göndərməyin!...");
$("textarea[name=mesaj]").removeAttr("disabled");
}else{
$("textarea[name=mesaj]").removeAttr("disabled");
$("textarea[name=mesaj]").val("");
sohbetupdate();
}
}
})
}
} }[/code]
Bizi burda bu xilas etdi:
//conf/function.php
case: "gonder";
$mesaj = mysql_real_escape_string(htmlentities($_POST['mesaj']));
$sess_user = mysql_real_escape_string(strip_tags($_SESSION['username']));
$level_yoxla = mysql_query("select * from users where username='$sess_user'");
$exp = mysql_fetch_array($level_yoxla);
$lvl = $exp['level'];
$write = mysql_query("insert into mesajlar (kim,mesaj,vaxt,level) values('$sess_user','$mesaj','$vaxt','$lvl')");
Hansıki error verir və query icra edilmir nəticədə:
Incorrect integer value: '' for column 'level' at row 1
(Column type int olması xilas etdi)
Şəxsən özüm də bu tipli səhvə yol vermişəm bu yaxınlarda.
Belə olsaydı amma vulnerable olmayacaqdı:
[code]
if(empty($_SESSION['hesab']))
{
header("location:index.php");
exit;//burda exit etdik skriptin isini dayandirdiq.
}
[/code]
yaxud belə:
[code]
if(empty($_SESSION['hesab'])){header("location:index.php");exit;}[/code]
Digər problem yarada bilən an AntiCSRF tokenlərin olmamasıdır.Bundan istifadə edən malicious user məsələn chatda link ata bilər CSRF exploitli səhifəyə nəticədə visit edən
adam(admin) ya chatı pozacaq özü də bilmədən ya da elə bir-bir id-ləri pozacaq yaxud logout-a force edəcək useri/admini.
(Man İn Middle üçün əlverişlidir force logout passı relogində sniff etmək üçün)
Bir dənə də kiçik problem var xüsusilə MYSQL 5.5.24 ilə.
Qeydiyyat edə bilmirəm heç cürə sql queryni debug edəndə:
[code]
$yaz = mysql_query("insert into users(username,password,ip) values('$user_name','$user_password','$ip')") or die(mysql_error());[/code]
aydın olduki:
Field 'level' doesn't have a default value
Field 'online' doesn't have a default value
[code]
mysql> \W
Show warnings enabled.
mysql> alter table `users` modify `level` int DEFAULT '2' after ip \g
Query OK, 2 rows affected (0.17 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> alter table `users` modify `online` int DEFAULT '0'\g
Query OK, 2 rows affected (0.09 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> show create table users \G
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
`ip` varchar(50) NOT NULL,
`level` int(11) DEFAULT '2',
`online` int(11) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
[/code]
problemi fixlədi.
Balaca bir qeyd də edim qeydiyyat zamanı login malicious ola bilər(Düzdür amma login edə bilməyəcək):
[code]
mysql> select * from users \g
+----+-----------------------------------+----------------------------------+-------------+-------+--------+
| id | username | password | ip | level | online |
+----+-----------------------------------+----------------------------------+-------------+-------+--------+
| 1 | admin | 7055eced15538bfb7c07f8a5b28fc5d0 | | 1 | 0 |
| 20 | test | 68358d5d9cbbf39fe571ba41f26524b6 | 192.168.0.1 | 2 | 0 |
| 21 | blab | d887e8d42c64040ae5aa0a603ab4b135 | 192.168.0.1 | 2 | 0 |
| 22 | onmouseover="alert(1)" | 7055eced15538bfb7c07f8a5b28fc5d0 | 192.168.0.1 | 2 | 0 |
| 23 | </span><script>alert(1);</script> | 7055eced15538bfb7c07f8a5b28fc5d0 | 192.168.0.1 | 2 | 0 |
+----+-----------------------------------+----------------------------------+-------------+-------+--------+
[/code]
Çalış bro qeydiyyat zamanı da yalnız alpha+num qəbul elə xüsusi simvollara icazə vermə.
//qeydiyyat.php
[code]
if($_POST){
if(!ctype_alnum($_POST['username'])) die('<script>alert("Nikinizde qadagan edilmis simvollar movcuddur!\nYalniz Herf ve Reqemler qebul edilir.");location.replace(\'?\');</script>');
[/code]
Və İMHO daha münasib olardı qeydiyyat mərhələsində captcha qoymaq çünki çoxsaylı POST zaproslarla (məsələn curl vasitəsilə)
çoxlu sayda fake user yaradıb bazaya insert etmək olar.Overload verəcək bu da MYSQL-ə.
Anticsrf tokenlər olsa (amma unikal hər zapros üçün) bu halda həmin floodun da qarşısı alınacaq.
Belə isə qəşəng skriptdir.
Gərək Ajax-a girişim vaxt edə bilsəm bir Çox qəşəng şeydir dinamik edir skripti.
Respect +Əməyə Hörmət
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-06-08 23:15 GMT |
|
|
|
VIP |
|
Mesaj Sayı : 1299 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 23 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : Gävle |
Ölkə : |
Məslək : Hacker,Defacer,Programmer |
Yaş : 26 |
Mesaj : |
|
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-06-08 23:33 GMT |
|
|
|
VIP |
|
Mesaj Sayı : 73 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 3 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-06-13 14:25 GMT |
|
|
|
Gold |
|
Mesaj Sayı : 58 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 2 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
|
Anti-armenia.ORG |
|