[BUUCTF 2018]Online Tool

参考

PHP escapeshellarg()+escapeshellcmd() 之殇

buuctf-[BUUCTF 2018]Online Tool(小宇特详解)_buuctf 2018onlinetool-CSDN博客

代码审计

很多不懂

[BUUCTF 2018]Online Tool_第1张图片

[BUUCTF 2018]Online Tool_第2张图片

$_SERVER 可以获取服务器和执行环境信息
HTTP_X_FORWARDED_FOR HTTP扩展头部,用来表示http请求端真实ip
REMOTE_ADDR代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

要想透过代理服务器取得客户端的真实 IP 地址,就要使用

$_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。

[BUUCTF 2018]Online Tool_第3张图片

函数escapeshellarg的作用是把字符串转码为可以在 shell 命令里使用的参数,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。 

就是在字符两端都加上单引号形成闭合,再加上\

[BUUCTF 2018]Online Tool_第4张图片

函数escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。

将不成对的单引号及任意\进行添加\的操作

eg:

  1. 传入的参数是:172.17.0.2' -v -d a=1
  2. 经过escapeshellarg处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
  3. 经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd\以及最后那个不配对的引号进行了转义
  4. 最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'

 

rce,但是又不能拼接命令,就只能借用nmap参数,有-oG参数可以实现将命令和结果写到文件

?host='  -oG hack.php '

引号内有空格

 

42c482ecd4f16ece50efc9cb108a33b2是文件夹

用蚁剑连接[BUUCTF 2018]Online Tool_第5张图片

你可能感兴趣的:(学习)