这个是一道围绕着php弱类型等一些杂项出的题目。
题目提示
访问题目连接,提示index.txt ,典型的源代码泄露
分析代码(代码在最后)
主要看要绕过哪些点:
1.第一个需要绕过的:
1 | if(md5($_SERVER['HTTP_BGROTNYSPXPD']) !=='9a8dae267c8e52a664c8cbf7cfe47b44'){ |
这个绕过很简单,只需要burp抓包加上一个BGROTNYSPXPD:HaHa即可。而不是加上HTTP_BGROTNYSPXPD。
2.第二层绕过:
1 | if(md5($_POST['encode']) !== '0a61bdaf2b1f5c00b319fa7c1373bbee'){ |
第二层if只需要POST提交一个md5值为0a61bdaf2b1f5c00b319fa7c1373bbee的值,再加上第一层绕过的方法就可以绕过了。
第一次做的时候我用python直接提交的包,可以绕过,写文章的时候,这样没法绕过,应该是#的原因,把encode提交的内容进行一次URLENCODE,再提交
绕过第二层if之后会给我一个$encodedSecret在后面会用到。并且给出了这个encodedSecret的算法:
1 | function encodeSecret($secret) { |
先把Hash转化成字符串得到=QcCtmMml1ViV3b然后解密:
1 |
|
获得明文:oubWYf2kBq
3.第三层绕过:
1 | $pass=unserialize(base64_decode($_GET['pass'])); |
要提交一个base64加密过的序列化数组,数组要满足的要求:
A.三个key对应的value不为空;
B. a和b不相等,且md5值相等(php弱类型);
C. c的长度小于4位,但是值要大于99999999
对于a和b QNKCDZO 与 s878926199a即可。对于c我在本地测试了一下9e9可以绕过。
1 |
|
用以上代码拿到pass的值。
第四层绕过还是一个PHP弱类型
1 | $aa = base64_decode($_GET['file']); |
只需要把 QNKCDZO 与 s878926199a进行一次base64加密就行
第五层,这个其实在第二层绕过的时候已经拿到了那个值。
1 | if(encodeSecret($_GET['onet']) == $encodedSecret){ |
onet=oubWYf2kBq
构造payload
http://xxx.xxx.xxx.xxx/code/index.php?pass=YTozOntzOjE6ImEiO3M6NzoiUU5LQ0RaTyI7czoxOiJiIjtzOjExOiJzODc4OTI2MTk5YSI7czoxOiJjIjtzOjM6IjllOSI7fQ==&file=UU5LQ0RaTw==&file1=czg3ODkyNjE5OWE=&onet=oubWYf2kBq
提交的时候在数据报头加上BGROTNYSPXPD:HaHa即可得到flag