保险网站程序源码,怎么制作微信公众号文章,秦皇岛网站推广价钱,网站建设怎么插图片这道题全程我都是用bp做的
拿到题目 我们查看页面源代码得到 代码审计
我们要用get传入id和gg两个参数#xff0c;id和gg的值要求不能相等#xff0c;但是id和gg的md5强比较必须相等 if(isset($_GET[gg])isset($_GET[id])) {$id$_GET[id];$gg$_GET[gg];if (md5($…这道题全程我都是用bp做的
拿到题目 我们查看页面源代码得到 代码审计
我们要用get传入id和gg两个参数id和gg的值要求不能相等但是id和gg的md5强比较必须相等 if(isset($_GET[gg])isset($_GET[id])) {$id$_GET[id];$gg$_GET[gg];if (md5($id) md5($gg) $id ! $gg) {echo You got the first step; 进入下一个循环体中我们看到了这个函数 is_numeric($passwd) s_numeric() 函数用于检测变量是否为数字或数字字符串。
PHP 版本要求PHP 4, PHP 5, PHP 7
如果指定的变量是数字和数字字符串则返回 TRUE否则返回 FALSE注意浮点型返回 1即 TRUE。 if(isset($_POST[passwd])) {$passwd$_POST[passwd];if (!is_numeric($passwd)){if($passwd1234567){echo Good Job!;highlight_file(flag.php) 所以这串代码是告诉我们如果post个passwd参数且passwd必须是数字或数字字符串passwd的值必须与1234567相等这里就是php的弱绕过当我们传入1234567a时就是字符型和数字型进行比较所以当传入的值passwd123456a的时候则会先把1234567admin转化成1234567再进行比较。 我们知道md5强比较绕过有两种方法第一种数组绕过因为md5无法处理数组返回null时即为true第二种就是用两个完全相同的md5值绕过即 array1%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2 array2%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2 所以我们用get传入?id[]1gg[]2 然后用bp抓包,传入passwd1234567a并将get请求变更为post 需要注意的点时此时如果重发包过去页面是没有反应的
我们需要将原先的get传入的参数复制了放在请求行上
即 因为变更请求时bp会将get的参数变为post所以我们需要重新写入
这样我们就得到了flag 总结
此题不难但是注意和收获的地方很多
收获
1.is_numeric() 函数用于检测变量是否为数字或数字字符串当为浮点数时返回值为1即为true
2.php的弱绕过
注意的点
我们在用bp变更包的请求方式时如果原先已经传入了get参数我们变更为post请求时bp会把原先的get传入的参数和后面加上的参数一样转换成post参数所以我们需要将原先get传入的参数放在包的请求行上使其成为get参数然后才能进行重发包