目录
一.get传参
第1关
方法——逃脱单引号控制,闭合单引号(注意,单双引号需成对出现,如python,php,java中,不然会报错,如下图)
此时可以考虑两个方案,继续把多出来的单引号闭合,或者注释掉单引号(msql注释符:-- # /***/ */)但由于编码规范,#注释的方法无效,但可以将其编码,效果如下
查询列数(可以使用order by进行检测),从1试到4发现4不成功,所以列数是3
但是发现它只取了第一行,所以我们要让它不能取,使第一个表查询为空,比如给个无效ID(绍 union 联合注入,union 的作用是将两个 sql 语句进行联合。)
将2,3列换成函数一样会产生
由此得知库名
最终目的是注入管理员的账号密码,这需要管理员表名和列名(可以联想到msql自带的三个库,),则输入对应函数,对其进行“爆破”
爆
数据库
爆
security
数据库的数据表
爆破user表的列
爆数据
关卡2,3,4主要是闭合方式不同,不多赘述
第5关
运行返回结果正确的时候只返回 you are in....,不会返回数据库当中的信息了,
所以我们不能利用上述 less1-4 的方法,这里开始学习使用盲注
要点:通过版本号测试可以发现,当结果正确会返回you are in....,反之则不会,那么我们可以利用这点
接下来看一下数据库的长度,根据多次测试,得出长度为8
接着猜测数据库第一位
由于上帝视角,我们知道数据库是security,所以我们看他的第一位是否 > a,很明显的是 s > a,因此返回正确。当我们不知情的情况下,可以用二分法来提高注入的效率
得知第一位为
s
,我们可以接着用这个方法看前两位是否大于
sa
很明显是的,接下来以此类推
利用 substr()进行截取,获取 security 数据库的第一个表的第一个字符
使用
substr(**,2,1)获取第二位字符
上述的语句中使用的
limit 0,1.
意思就是从第
0
个开始,获取第一个。那要获取第二个就是 limit 1,1,这样即可获取第二张表
由于效果图都一样,这里开始就不贴图了
113
返回值就是第二个
referers
表的第一位:r
之后按需求不断重复上述过程即可(第6关同上,单引号变双引号而已)
报错注入(个人理解:特意利用源代码所会产生的报错,针对性的获取所需信息)
利用 double 数值类型超出范围进行报错注入
利用
bigint
溢出进行报错注入
xpath 函数报错注入
延时注入(正确和错误时返回时间不同,通过这个可以判断值是否正确)
利用
sleep()
函数进行注入
当错误的时候会有
5
秒的时间延时。适用于报错返回被过滤,成功失败界面相同的场景,如第8,9关
第7关
使用的是dump into outfile,要求
利用文件导入的方式进行注入,不过条件苛刻,首先要有root权限,接着需要知道网站路径,最后还需要一个为空,就真的是空的,不是null,由于条件过于苛刻,因此很少见(其原理就是利用其先上传再删除的机制,可以与程序抢进程,使其上传到上级目录,这样即使原目录的文件删除也没用)
第8关
也可以使用布尔注入判断真假,但报错不行,被过滤掉了,(查看源代码即可)伪布尔也就是延时注入也可以成功,可以说是布尔之关的开始了
第9关
是基于时间来判断的,利用延时注入进行,同时 id 参数进行的是 ’ 的处理。
正确的时 候直接返回,不正确的时候等待 5
秒钟,由此判断值正不正确,延时注入第5关有写,这里不接着演示了,太费时间(第10关一样,只不过变成双引号)
二.post注入
第11关
输入正确的用户名和密码如下
在
post
过程中,输入的用户名和密码最后在后台处理的过程中依旧会形成前面所见到
的
sql
语句,开始尝试像
get
型的一样构造想要的
payload
这里我输的是admin',密码随意
显示错误了,可以从错误中分析到程序对参数进行单引号的处理
开始尝试万能密码username
输入:
admin'or'1'='1#
,密码随意
成功,
提交
username
和
password
后,后台形成的
sql语句为:
@$sql="SELECTusername,passwordFROMusersWHEREusername='admin'or'1'='1
#
password='$passwd'LIMIT0,1";
在
#
以后的内容就被注释掉,前面的内容因为
or1=1
恒成立,所以语句就成立,我们此时以
admin
的用户登录。那么接下来我们尝试用
get
注入中用到的其他的语句代替
or1=1
进行注
入。
开始尝试联合查询即union注入
Username
:
1admin'union select 1,database()# 密码随意
到显示了
database
为
security,然后就和之前的联合查询一样了,一个个查就行
第12关
单引号变双引号,区别不大
第13关
不会显示你的登录信息了,只能给你一个是否登录成功的返回数据。
从报错信息可得知程序对 id 进行了 ‘) 的处理
这里可以使用布尔类型的盲注
猜测数据库第一位
uname=
admin')and left(database(),1)>'a'#
&passwd=
1
&submit=submit 密码随意
登录成功,可以挨着对每一位进行测试,方法和关5是一样的,不过地址栏输入变成输账号密码而已,主要是账号(14关相同,只是换成双引号)
第15关
没有错误提示,只能靠猜测进行注入。从源代码@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";中得知,需要对 id
进行
‘ id’
的处理。
利用延时注入进行,猜测数据库名第一位:
正确的时候可以直接登录,不正确的时候延时
5
秒以此来进行判断,和get中的延时注入换汤不换药(这里不放图了,毕竟看不到效果,16关一样,还是单引号变双引号)
第17关
看到
admin’’ 说明在对密码的处理过程中使用的是 ‘’
可以使用报错注入uname=admin&passwd=11'and extractvalue(1,concat(0x7e,(select @@version),0x7e))#&submit=submit
也可以使用延时注入uname=admin&passwd=11'andIf(ascii(substr(database(),1,1))=115,1,sleep(5))#&submit=submit
布尔注入也可以,毕竟成功页面和失败页面不同
接下来不多搞了,总结一下,get和post区别不大,都是看反馈选择对应的注入方式,不过一个主要靠地址栏,一个看from菜单输入,根据不同需求选择注入方式,联合查询就是一起查,全部一起显示,不过要注意长度限制,和表名列名获取等等。报错注入就是页面会返回错误信息,那么我们可以把注入的语句的结果直接返回在页面的错误信息反馈中。布尔注入可以根据返回页面判断条件真假的注入,因为成功页面和失败页面不同。延时注入也就是时钟注入,在以上都不行时,通过请求页面时,成功和失败的时间不同,来达成布尔条件判断是否正确,算是伪布尔注入了
outflie文件导入前面写的算是详细了就不多写了
第18关开始就要使用工具抓包改包了,暂时就整理到这里了