1
直接写一个php文件测试一下,发现弹窗不让上传
原理很简单,就是把后缀名拿出来过滤一遍,而白名单就是弹窗的这三个
解决方法:
因为这是在前端防御的一个手段,所以直接在浏览器设置上禁用js就行了:
也可以用bp抓包然后直接改后缀
2
这关检测的是文件类型,也就是content-Type
那就直接抓包改文件类型content-Type:image/jpeg就搞定了
3
这关过滤了.asp,.aspx,.php,.jsp后缀名
根据这道题的httpd.conf文件的AddType application/x-httpd-php .php .php3.phtml,php3自动解析成php,所以后缀名改成php3就行了,这关方法仅限这道题
4
利用.htaccess文件,一般适用于伪静态的,也可以控制网站根目录下的文件解析,所以我们创建一个htaccess文件,然后写入规则:AddType application/x-httpd-php .jpg,作用就是将这个.jpg后缀当成php解析。
所以我们先上传这个htaccess文件,然后再上传图片马,就成功了
图片马的创建:
一个图片,一个php文件,然后在命令行下copy xxx.jpg/b + xxx.php/a mmm.jpg,这个mmm.jpg就是图片马
5
这关没有大小写过滤,直接后缀名改成PHP就行了
6
没有过滤空格,用bp抓包在php后面加个空格变成'.php '就成功上传了
注:这个特性是windows下的,linux是不行的
7
没有删除文件后缀的点,又因为windows会自动去除点,那就抓包改成xxx.php.直接绕过,然后windows自动去除点后执行php
8
这关没有过滤::$DATA
像这样写:xxx.php::$DATA,这个::¥DATA写了就相当于没写,但是可以绕过上传成功
9
尝试下冒号截断:冒号可以将web.php:jpg截断,用jpg绕过后再把jpg丢掉,php上传成功,但是文件内容也被清空了。
解决方法:在windows+php+iis(部分apache也可以),<等于*。
那么我们这样写:web.<<<,会转换成???然后会匹配三个任意字符,就匹配上web.php了。
所以这道题抓包改后缀名即可:
10
这关直接抓包双写绕过xxx.phphpp
11
看源码得知上传一个图片放到临时文件夹,然后通过move函数把这个临时文件覆盖到upload目录,正常情况下会是upload/temp.jpg
问题在于这个路径是get,我们可以控制,所以抓包改路径构造成upload/shell.php%00temp.jpg
这样就会把后面的jpg截断,因为php底层是c语言,00在c语言中是停止的意思
所以相当于把shell.php传到upload目录了
(这是php5.2的漏洞)
12
还是00截断,只是改成post了,%是urlcode编码的,这里不能用%了
可以随便写一个内容,这里写了一个点,然后再post的16进制里改成00
13
检测文件内容的前两个字节
先创建一个shell.gif文件,然后在一句话木马之前写一个GIF89a,这是伪造的图片头,上传成功,但是不能用,用文件包含才能用,先复制图片路径,然后打开一个include的文件,再添加参数为图片路径
include就是一个把包含的文件当成php执行的函数
14
用图片马,然后加上一个include包含就行了
.jpg .png后缀的时候不用加GIF89a
15
增加了一个类型判断:
跟上一关操作一样
16
过滤图片马了,也就是会打乱图片顺序,所以图片马就会被打乱了,不能用。
先随便传个上传个图片马,然后再把这个图片下载下来看看发现里面的一句话木马乱了
思路就是在没有混淆的地方插入一句话木马,所以我们用010editor找可以放一句话木马的地方(只要能放下就行):
然后把一句话木马插入这个不会改动的地方就能上了(可能找的地方会把图片格式弄乱,那就换一个地方写一句话木马):
再把文件复制下来用文件包含打开即可(GIF好改一点,jpg、png格式比较复杂,改动容易出错,会被判定为不是jpg、png格式)
jpg、png的话可以用脚本来弄,思路跟gif一样
顺便提一句:比较好的防御方法是吧上传图片文件夹的执行权限去掉
17
这是在上传成功以后才判断的后缀,所以直接写php文件
这关用一个竞争型的思路,因为这源码看得出来,先上传后再判断是否要删除
我们写这样一个php文件:
<?php fputs(fopen('../shell.php','w'),'<?php phpinfo();?>')>;
这个文件执行的话会在上一级目录创建一个php文件,当然,这个文件会被马上删除,但是在上传到删除之间是有一定时间的,我们正是要利用这一点。
手工操作不现实,所以用bp的爆破的方式,相当于多次上传,然后我们就访问xxx/shell.php,一直手动刷新。也可以用bp再开一个进程,一个上传,一个访问就可以访问到了
想避免这种条件竞争的漏洞就先过滤再上传