zoukankan      html  css  js  c++  java
  • DVWA-Command Injection命令注入(全等级)

    Command Injection

    Command Injection,即命令注入,是指在某些需要输入数据的位置,还构造了恶意的代码破坏了原先的语句结构。而系统缺少有效的过滤,最终达到破坏数据、信息泄露甚至掌控电脑的目的,许多内容管理系统CMS存在命令注入漏洞。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一。

    Low

    打开DVWA,发现这一关是通过ping ip地址来注入的,我们首先试一下自己的主机

    接下来我们看一下源码,源码的路径如下图

     这里补充函数知识

    stristr(string,search,before_search)

    stristr函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的ASCII值的字符),可选参数before_true为布尔型,默认为“false”,如果设置为“true”,函数将返回search参数第一次出现之前的字符串部分。

    php_uname(mode)

    这个函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。

    可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞

    Command 1&&Command 2

    先执行Command 1,执行成功后执行Command 2,否则不执行Command 2

    “|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果

    所以在文本框里输入”127.0.0.1 && net user”,得到以下系统中所有的用户

     出现了乱码

    解决乱码问题

    DVWA-masterdvwaincludes目录下找到dvwaPage.inc.php文件中所有的”charset=utf-8”,修改”charset=gb2312”,即可。

     

     再次输入127.0.0.1&&net user 发现乱码消失,我们将红框圈住的部分复制下来,接下来会用到

    我们输入”127.0.0.1 && net user SUPPORT_388945a0”得到SUPPORT_388945a0账号的属性,当然还可以增删账号密码等 

    Medium  

     我们查看代码

     发现这里有所不同,服务器端对ip参数做了一定过滤,即把”&&” 、”;”删除,我们尝试使用&

    在文本框上输入 127.0.0.1& new user

     发现登陆成功,这里解释下,因为被过滤的只有”&&”与” ;”,所以”&”不会受影响,

    注意的是”&&”与” &”的区别:

    Command 1&&Command 2

    先执行Command 1,执行成功后执行Command 2,否则不执行Command 2

    Command 1&Command 2

    先执行Command 1,不管是否成功,都会执行Command 2

    因为使用的是str_replace把”&&” 、”;”替换为空字符,因此可以采用以下方式绕过:

    127.0.0.1&;&ipconfig 

    这是因为”127.0.0.1&;&ipconfig”中的” ;”会被替换为空字符,这样一来就变成了”127.0.0.1&& ipconfig” ,会成功执行。

    High

    查看代码发现过滤掉了很多符号如& ; | - $ ( ) ` ||   但我们仔细观察发现|(管道符)后面有空格,所以我们可以单纯使用管道符|试一下。”|”是管道符,意思是将前者处理后的结果作为参数传给后者。(将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果)

     在文本框中输入 127.0.0.1|net user

     (不知道为什么,我这里总出现“命令运行完毕,但发生一个或多个错误”,其他的位置都是正确的)

    Impossible

    查看代码

     stripslashes(string)

    stripslashes函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。

    explode(separator,string,limit)
    把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目。

    is_numeric(string)
    检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE。

    可以看到,Impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

  • 相关阅读:
    AcWing 1027. 方格取数 dp
    AcWing 1014. 登山 dp
    acwing 482. 合唱队形 dp
    LeetCode 1463. 摘樱桃II dp
    LeetCode 100. 相同的树 树的遍历
    LeetCode 336. 回文对 哈希
    LeetCode 815. 公交路线 最短路 哈希
    算法问题实战策略 DARPA大挑战 二分
    算法问题实战策略 LUNCHBOX 贪心
    AcWing 1100. 抓住那头牛 BFS
  • 原文地址:https://www.cnblogs.com/heiwa-0924/p/12449940.html
Copyright © 2011-2022 走看看