Web应用安全

RCE

RCE概念

远程命令/代码执行

  • 全称Remote Command/CodeExecute,远程命令/代码执行
  • 通过构造特殊字符串,将数据提交至Web应用程序,并利用该方式执行外部程序或系统命令实施攻击

RCE的原理

  • Web应用程序使用了一些可以执行系统命令或代码的函数,而且对用户提交的数据过滤不严格,导致黑客利用服务器可以执行命令或代码

eval()函数

语法

  • eval(string $code):mixed

说明

  • 将字符串作为PHP语句来执行
  • 该字符串必须是合法的PHP代码,且以分号作为结束
1
2
3
<?php
eval("echo (2+2)");
?>

assert()函数

语法

  • assert(mixed $assertion, string $description =?):bool

说明

  • 检查一个断言是否为 false
  • 如果assertion 是字符串,它将会被assert()当做 PHP代码来执行
1
2
3
4
5
<?php
$num=100;
$ret=assert("is_int($num);");
var_dump($ret)
?>

preg_replace()函数

  • 语法
    • preg_replace(mixed $pattern , mixed $replacement , mixed $subject [, int $limit=-1[,int &$count]]):mixed
  • 说明
    • 搜索subject中匹配pattern的部分,以replacement进行替换
    • 5.5.版本后,传入”e”修饰符时,会产生一个E_DEPRECATED错误
    • 7.0.0不再支持/e修饰符,请用 preg_replace_callback()代替
  • 案例
1
2
3
<?php
preg_replace("/test/e",phpinfo(),"just test");
?>

exec()

语法

  • exec(string $command, array &$output = ?, int &$return_var= ?):string

说明

  • 执行command 参数所指定的命令
1
2
3
<?php
echo exec('whoami').'<br>';
?>

类似函数

  • string exec(string $command [, array &$output [, int &$return_var ]])
  • string shell_exec(string $cmd)
  • string escapeshellcmd(string $command)
  • void passthru(string $command [, int &$return_var ])
  • 反引号
1
2
3
4
5
<?php
#使用反撇号,按时作为命令来执行
$result='whoami';
echo $result;
?>

命令连接符

命令连接符

符号 说明
cmd1 && cmd2 执行cmd1,执行成功后执行cmd2,否则不执行cmd2
cmd1 & cmd2 表示先执行cmd1,不管是否成功都执行cmd2
cmd1 || cmd2 表示先执行cmd1,执行失败后执行cmd2
cmd1 | cmd2 将cmd1的输出作为cmd2的输入,只打印cmd2执行的结果

RCE防御

  • 尽量避免使用危险函数
  • 对用户输入严格检查和过滤

PHP文件上传漏洞

文件上传

  • 文件上传是Web应用的常见功能,允许用户上传图片、视频及其他文件类型文件
  • 向用户提供的功能越多,Web应用受攻击的风险就越大

文件上传漏洞

  • 上传文件时,如果未对上传的文件进行严格的验证和过滤,攻击者就可以上传恶意的脚本文件,例如: php、jsp、asp以及aspx等

  • 恶意上传行为可能导致网站甚至整个服务器被控制恶意的脚本文件,又被称为WebShell

upload-labs,文件上传漏洞靶场

14.3.1

Pass-01前端限制与绕过

本pass在客户端使用js对不合法图片进行检查!

14.3.2

14.3.3

绕过方法

  • 在浏览器的调试窗口修改表单的onsubmit事件

14.3.4

Pass-02 MIME限制与绕过

本pass在服务端对数据包的MIME进行检查!

14.3.5

MIME(Multipurpose Internet Mail Extensions)

  • 多用途互联网邮件扩展类型
  • 是一个互联网标准,扩展了电子邮件标准,可以支持更多的文件格式

常见的MIME类型

扩展名 类型/子类型
doc application/msword
gif image/gif
html text/html
jpeg image/jpeg
jpg image/jpeg
pdf application/pdf

本pass在服务端对数据包的MIME进行检查!

  • $_FILES[[‘upload_file’][‘type’]是从请求包的Content-Type中读取

14.3.6

绕过方法

  • 通过代理burpsuite抓包修改文件的MIME类型将红色字体部分,换成image/jpeg
  • 点击forward,将修改后的请求发送给服务器

14.3.7

Pass-03黑名单限制与绕过

本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!

14.3.8

14.3.9

绕过方法

  • 将文件后缀由php修改为phtml、phps、php3均可
  • 另外需要修改Apache的配置文件,增加下列项
1
AddType application/x-httpd-php .php .phtml .php3 .phps

6、Pass-04黑名单限制与绕过

本pass禁止上传.php|.php5|.php4|.php3|.php2|.php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|.pHp1|.Html|.Htm|.pHtml|.jsp|.jspa |.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx |.jSpa |.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa .|asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.swfl|.swf 后缀文件!

14.3.10

绕过方法

  • 没有过滤htaccess后缀,我们可以构建一个htaccess配置文件,让所有格式文件都解析为php。
  • .htaccess语句
1
SetHandler application/x-httpd-php