[BUUCTF 2018]Online Tool

首先要知道这escapeshellarg()和escapeshellcmd()两个函数组合会产生漏洞

escapeshellarg() 是 PHP 中一个重要的安全函数,用于将字符串转义,以便安全地作为参数传递给 shell 命令。
功能概述
  • 作用: 将字符串用单引号包裹,并转义字符串中已有的单引号

  • 目的: 防止 shell 命令注入攻击

  • 返回值: 返回转义后的字符串

    escapeshellcmd() 是 PHP 中用于转义 shell 命令中特殊字符的函数,防止命令注入攻击。
    功能概述
    • 作用: 转义 shell 命令中的元字符

    • 目的: 防止 shell 命令注入攻击

    • 返回值: 返回转义后的字符串

    转义规则

    escapeshellcmd() 会转义以下字符:

    •  `#` `&` `;` `|` `*` `?` `~` `<` `>` `^` `(` `)` `[` `]` `{` `}` `$` `\\` `\x0A` `\xFF` `'` `"` ``` ` `

首先看题,接收一个host参数,值自定义,结合字符串经过md5加密后创建目录并切换至目录(这里其实就可以联想到写文件了,创建了目录就是来放东西的)

执行了nmap命令,这里构造payload利用了nmap中的-oG方法,可以实现将命令和结果写到文件

这里直接贴上payload并解析

 ?host=' <?php echo `cat /flag`;?> -oG test.php '

首先payload经过escapeshellarg()函数后会自动套上一对单引号并对内部单引号转义

 ''\'' <?php echo `cat /flag`;?> -oG test.php '\'''

最外层单引号是函数添加的

内部单引号被\转义,\也被添加上双引号

进入escapeshellcmd()函数后对\和不成对的单引号进行转义

 ''\\'' <?php echo `cat /flag`;?> -oG test.php '\\'''

这里单引号将payload分成了多份

 '' \\ '' <?php......php '\\' ''

这样payload就不会被单引号包裹,可以正常执行命令了

值得注意的是,因为后端是linux系统,在linux中,\代表转义符,system执行命令的参数是string类型,转义了也能正常执行,没被单引号包裹的\\就是\,被单引号包裹的仍是\\

第二个值得注意的地方是:

最后的payload要加空格和'

不加空格最后文件名变为test.php\,会被解析为路径,test.php \后面的\会被忽略

不加单引号会变成test.php',都无法正常执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值