本实验的内容是了解php命令注入攻击的过程,掌握思路。
命令注入攻击
命令注入攻击是指黑客利用HTML代码输入机制的缺陷(如表格字段缺乏有效的验证限制)改变网页动态生成的内容。因此,系统命令操作可以用于实现通过使用远程数据来构造要执行的命令的操作。PHP中可以使用以下四个函数来执行外部应用程序或函数:system、exec、passthru、shell_exec。
信息来源——和田网安实验室
为什么命令攻击会形成漏洞?第一个原因是应用程序需要调用一些执行系统命令的函数,比如上面提到的php中的system函数。其次,当用户可以控制这些功能中的参数时,会将一些恶意命令拼接成正常命令,进而造成命令执行漏洞。因此,我们可以获得命令执行漏洞所需的条件:
执行应用程序调用的系统命令的用户可以控制这些命令,从而拼接恶意命令。应用程序没有过滤用户的输入,或者过滤不够严格,无法通过命令执行的漏洞。我们可以在服务器上读写一些文件,这些文件是用户不想看到的,比如密码敏感文件。此外,我们可以通过命令打开服务器的远程服务,这样我们就可以获得服务器的外壳并控制服务器或这个网页。此外,我们可以进一步渗透内部网。
让我们开始实验。
1.让远程服务器执行whoami的命令。(whoami命令是查询当前用户身份的命令,如管理员或普通用户)打开实验环境,如下图所示,让其执行whoami命令。
根据返回的结果,服务器应该是windows系统,后面会补充。
服务器中的密钥代码如下:
程序获取get参数ip,然后将其拼接到system()函数中,并使用system()函数执行ping函数。但是,此处不过滤和检测参数ip,因此可以使用管道符号执行其他系统命令,管道符号是管道符号的补充。
windows中的“|”表示:把前面的结果作为后面的输入,我们用ip=127.0.0.1|whoami来试试
以下命令成功执行,我们的身份是系统
在windows中,“”的意思是:两个命令一起执行,首先在执行之前,然后在执行之后。让我们用ip=127.0.0.1whoami来试试
可以看到whoami命令没有成功执行,因为“”是ulr中的连接符号,会被转义为“&”,所以如果我们直接使用“&”的话,会被转义为real“”,不妨用ip=127.0.0.1&whoami再试一次。
当命令成功执行时,我们可以看到服务器执行了两个命令(ping和whoami),我们的身份是system
在windows中,“| |”表示当前一个执行失败时,后一个将被执行。让我们用ip=127.0.0.1||whoami来试试
这一次,whoami命令没有执行,因为之前的命令可以执行。我们只需要让前一个命令不可执行,让它自动执行下一个命令。根据上面提供的关键代码,我们知道只要传入正常的ip地址,命令(ping)就会成功执行,所以我们尝试消除该ip地址,并使用ip=||whoami进行尝试
命令成功执行,我们的身份是系统
2.让远程服务器执行ipconfig命令
服务器的关键代码如下
添加:
函数preg_match()用于正则表达式匹配,成功返回1,否则返回0。如果preg_match()成功匹配一次,它将停止匹配。如果要匹配所有结果,需要使用preg_match_all()函数。函数头()向客户端发送一个原始的HTTP头。标头是服务器在通过HTTP将HTML数据传输到浏览器之前发送的字符串,标头和HTML文档之间仍有一个空行。
这段代码只是过滤ip地址。如果匹配,它将执行下面的命令系统。如果不匹配,它将无法执行以下ping命令,即我们在开头看到的界面:
因此,如果我们想让服务器执行ipconfig,首先想到的就是让它出错,执行失败,用双管让它执行ipconfig。接下来,让我们用ip=127来试试。||ipconfig:
成功
同样,让我们用单个管道(ip=127.0.0.1|ipconfig)来尝试一下:
成功
继续,我们用“&”(IP=127 . 0 . 0 . 1 & ipconfig)来试试:
执行了两个命令。成功!
知识补充
我们可以通过ping命令返回的结果中的TTL项来检查服务器的操作系统:Linux ——64 Win 2k/NT ——128 Windows系列——32 UNIX系列3354255(操作系统在前,TTL值在后)。我们可以通过ping来返回结果,看看哪个TTL值最接近,服务器是哪个操作系统。
让我们试试ping百度
如果TTL值为52,则它和64之间有12条路由,因此它的服务器应该是LINUX。
然后添加一些常用的管道符号:
Windows系统支持以下管道符号:
' | ':直接执行以下语句。" | | ":如果前一条语句执行失败,将执行后一条语句,前一条语句只能为false。" ":两个命令都执行。如果前面的语句为false,将直接执行下面的语句。前面的说法真的是假的。" ":如果前一条语句为false,则直接出现错误,不会执行后一条语句。如果前一条语句为真,两个命令都将被执行,前一条语句只能为真。Linux系统支持以下管道符号:
";":在执行下面的语句之前,先执行前面的语句。| ':显示以下语句的执行结果。" | | ":当前面的语句错误时,执行下面的语句。" ":两个命令都执行。如果前面的语句为假,将执行下面的语句。前面的说法真的是假的。" ":如果前一条语句为false,则直接出现错误,不会执行后一条语句。如果前一条语句为真,两个命令都将被执行,前一条语句只能为真。总结一下:这种需要分析代码的问题一定不能马虎,需要仔细理解破解它的秘密意味着什么。这个实验不是很难。之前做CTF——Web问题的时候遇到过,和这个差不多。我通过分析代码构造url来获取标志。
以上就是边肖介绍的php命令注入攻击的详细讲解和集成,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!