github编辑

[安洵杯 2019]不是文件上传

[安洵杯 2019]不是文件上传

考点

  • PHP代码审计

  • SQL中的INSERT注入

  • POP构造

wp

先随便上传图片,提示上传成功并且图片的id为1

Your images is uploaded successfully. And your image's id is 1.

在show.php中可以看到上传的图片信息,上传文件的名字被服务器做了加密,根据提示可以知道服务器只存储的图片名字,可能是在文件名那里注入,但是很多信息不知道。

在主页下面可以看到Powered By wowouploadimage,在GitHub上可以找到源码,要分析上传的逻辑

假设上传的文件是test.jpg,先看一下helper::check 函数的处理,$info相当于$_FILES["file"]

	public function check($info)
	{
		$basename = substr(md5(time().uniqid()),9,16); // 16位随机字符串,假设是ffffffffffffffff
		$filename = $info["name"];  // 上传文件名
		$ext = substr(strrchr($filename, '.'), 1);  // 上传文件后缀名
	    $title = str_replace(".".$ext,'',$filename);  // 上传文件前缀名
	    return array('title'=>$title,'filename'=>$basename.".".$ext,'ext'=>$ext,'path'=>$this->folder.$basename.".".$ext);
	}

最后函数的返回是

然后回到helper::uplaod 函数的处理上传文件,按照上面的返回看

然后看helper::save函数保存的逻辑,用了INSERT语句进行插入操作

具体的语句是这样,其中title是可控的,那就可以插入任意数据

再看看show.php,会直接执行show::Get_All_Images这个函数,然后对attr的数据进行反序列化

再看helper类的__destructview_files 函数,刚好可以构成反序列化链

这就连在一起了,接下来构造反序列化就可以

由于属性是protected 所以是有不可见字符的,但是在POST传输不会对内容进行URL解码,所以要用SQL可以自动转码的hex编码,用bin2hex函数,最后的语句如下

上传文件,filename改成1','1','1','1',0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d)#.jpg ,再访问show.php即可

小结

  1. PHP反序列化和SQL结合时要注意一下编码问题,如果URL编码不行要试试hex

  2. 代码审计搞明白每一段代码作用

最后更新于