php代码审计基础2
0x00 前言
本篇回接着上篇php代审文章,做详细记录……
0x01 审计前置基础
Php黑魔法:
eval()
在执行命令时,可使用分号构造处多条语句。类似这种。

curl_setopt()
存在ssrf漏洞。

parse_url()
此函数主要用于绕过某些过滤,先简单了解一下函数的基本用法。

反序列化漏洞:
在 PHP 中主要就是通过serialize和unserialize来实现数据的序列化和反序列化。

学习php.ini安全配置项
① register_globals(全局变量注册开关)
该选项在设置为on的情况下,会直接把用户get、post等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。从PHP5.3起被弃用,在5.4中移除了该选项

② allow_url_include(是否允许包含远程文件)
allow_url_include在PHP5.2后默认设置为off,类似函数allow_url_include

③ magic_quotes_gpc(魔术引号自动过滤)
magic_quotes_gpc 在安全方面做了很大的贡献,当选项设置为on时,会自动在get、post、cookie变量中的单引号、双引号、反斜杠及空字符(null)的前面加上反斜杠(\),但是在PHP5中并不会过滤$SERVER的变量,导致很多类似client-ip、referer一类的漏洞能够利用。在PHP5.3之后不推荐使用magicquotes_gpc。PHP5.4直接取消。
④ magic_quotes_runtime(魔术引号自动过滤)
自动转义单引号、双引号、反斜杠及空字符,在前面加上反斜杠。他跟magic_quotes_gpc的区别是,处理的对象不一样,它只对数据库或者文件中获取的数据进行过滤。
⑤ magic_quotes_sybase(魔术引号自动过滤)
此函数会覆盖magic_quotes_gpc的配置,它仅仅转义了空字符和把单引号变成双引号。在PHP5.4.0中移除了该选项。
⑥ safe_mode(安全模式)
当safe_mode=on时,联动可以配置的指令有safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_protected_env_vars。这些PHP5.4之后被取消
这些配置会出现下面限制:
1)所有文件操作函数(例如:unlink()、file()、include())等
2)通过函数popen()、system()以及exec()等函数执行命令或者程序会提示错误。如果我们需要使用一些外部脚本,可以把它们集中在放在一个目录下,然后使用safe_mode_exec_dir指令指向脚本的目录
下面是启动safe_mode指令时受影响的函数、变量及配置指令的完整列表:
apache_request_headers()、ackticks()、hdir()、hgrp()、chmode()、chown()、copy()、dbase_open()、dbmopen()、dl()、exec()、filepro()、filepro_retrieve()、ilepro_rowcount()、fopen()、header()、highlight_file()、ifx_、ingres_、link()、mail()、max_execution_time()、mkdir()、move_uploaded_file()、mysql_*、parse_ini_file()、passthru()、pg_lo_import()、popen()、posix_mkfifo()、putenv()、rename()、zmdir()、set_time_limit()、shell_exec()、show_source()、symlink()、system()、touch()。
⑦ open_basedir PHP可访问目录
open_basedir指令用来限制PHP只能访问哪些目录,通常我们只需要设置web文件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到open_basedir指令中,多个目录以分号(;)分隔。注意请用斜线结束路径名。例如设置成:open_basedir=/www/a/.

⑧ disable_functions(禁用函数)
在正式的生产环境中,为了更安全地运行PHP,也可以使用disable_functions指令来禁止一些敏感函数的使用。当你想用本指令禁止一些危险函数时,切记要把dl()函数也加到禁止列表,因为攻击者可以利用dl()函数来加载自动以的PHP扩展以突破disable_functions指令的限制。
本指令配置范围为php.ini only。配置禁用函数时使用逗号分隔函数名,例如:disable_functions=phpinfo,eval,passthru,exec,system。
⑨ display_errors和error_reporting错误显示
display_errors表明是否显示PHP脚本内部错误的选项,在调试PHP的时候,通常都把PHP错误信息显示打开,但在生产环境中,建议关闭PHP错误回显,即设置display_errror=off,以避免带来一些安全隐患。在设置display_errors=on时,还可以配置的一个指令是error_reporting,这个选项用来配置错误显示的级别,可使用数字也可以用内置常量配置,数字格式与常量格式的详细信息如下表所示.

这两个指令的配置范围都是php_ini_all。
会影响到安全的指令大致就介绍到这里,下表为一些常用指令以及对应的说明。

0x02 审计练习
易思(espcms)练习
在seay审计系统审计:

双击进入定位到该SQL语句中

看到$parentid变量是怎样获得的

定位accept函数的实现方法
可以看到我们传入的变量parentid和R参数代表的是POST、GET中获取的值,最后一个经过了daddslashes这个函数进行处理


从这条SQL语句中我们可以看到对单引号等字符进行过滤,并不需要闭合,可以直接注入:
$sql = “select * from $db_table where parentid=$parentid”;
接着,我们定位到citylist.php这个文件中,看到oncitylist这个函数在important这个类中,点击全局搜索功能,双击进入index.php这个文件

这里存在一个include文件操作,但是经过了daddslashes函数的操作,我们无法进行截断使其包含任意文件,只能包含本地的PHP文件,若拥有本地的MYSQL的root权限,导出到tmp目录中就能实现文件包含注入攻击。

构造一个EXP的URL进行完成注入:
/espcms/adminsoft/index.php?archive=citylist&action=citylist&parentid=-1 union select 1,2,user(),4,5
Douphp练习

进行安装,会生成一个配置文件

生成config.php文件

删除install.lock和config.php,系统将会重装。

看config.php文件 $dbhost对应填写主机

重装,在填写主机处填入${phpinfo()}

可成功利用。

审一下代码看有没有文件删除的可利用函数,先正常安装项目

在seay进行审计,全局搜索unlink函数


定位一下$mobile_logo可以看到73行,他是由数据库控制的
$mobile_logo = $dou->get_one(“SELECT value FROM “ . $dou->table(‘config’) . “ WHERE name = ‘mobile_logo’”);
看一下上面的数据库语句
定位get_one函数,注释写道他是读取数据的一个值

查询了一个value的值在config表里,条件是name=mobile_logo
所以将mobile_logo的值改为config.php,系统就会重装
数据库定位:

这儿的注释是删除收集logo的图片

去后台找找

Log图标是可以上传的。
上传图标后有个删除的按钮

点击删除抓包,没有改的地方,接着审代码
重新上传图片监控数据库发现数据库执行的语句

此处发现$mobile_logo可以POST传参改变

上传的图片位置在:\m\theme\default\images

所以需要删除的文件在:../../../../data/config.php
点击上传图片抓包:

将filename去掉。
传参post,放包

点击删除log后发现系统已经重置

重新安装可进行命令注入

总结一下,只删除config.php他会重装,不过会重装锁定,需要删除install.lock解锁来进行重装,所以本次重装了多次
持续更新……