文章目录
说明
本文为以下博客的配餐
Web安全-SQL注入:MySQL注入天书(0)
Web安全-SQL注入:sqlmap布尔型盲注payload解析
Web安全-SQL注入:为什么拿不到os-shell
%23和–+
注意–+是两个减号一个加号
%23其实就是URL编码后的 #
即SQL语句中的注释符
两者都可在字符型注入中用于处理后面的单引号
如
有拼接SQL语句的PHP代码如下
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
payload传入
1' ORDER BY 4 %23
数据库执行的是
SELECT * FROM users WHERE id='1' ORDER BY 4 #' LIMIT 0,1
ORDER BY
格式
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]
其中的field1也可用表示第几列的数字来替换,从1开始,表示按第1列排序,见示例
示例
用途
执行ORDER BY num报错可以判断表中列数小于num
UNION
格式
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
# 不加ALL或加DISTINCT不选重复
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
用于查询多张表中相同列的数据,返回到同一个结果集中
示例
用途
使用ORDER BY 判断出表中列数后可以使用UNION从INFORMATION_SCHEMA
数据库中选出信息,在浏览器中可以看到
INFORMATION_SCHEMA是“数据库的数据库”,其用于存储数据库名、表名、列的数据类型、访问权限等,其SCHEMATA表中有当前所有的数据库信息,表中schema_name字段存放所有的数据库名
GROUP_CONCAT
格式
SELECT GROUP_CONCAT(column_name) FROM table_name;
将查询到的所有列值拼接到一起返回
示例
AllStudentNo
10010501,10030408,10040412,11010202,11020413,12010403,12020306,12020705,12030409,13010304,13020307,13030410,13030411
用途
当网页只显示一个值时可以先拼接到一起然后再使其显示此值
比如爆数据库名时需要
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;
SCHEMA_NAME是INFORMATION_SCHEMA数据库中SCHEMATA表中的一个字段,存放所有数据库名
这样虽然可以选出来所有的数据库名,但网页往往只能显示一个值
所以换用
SELECT GROUP_CONCAT(schema_name) FROM INFORMATION_SCHEMA.SCHEMATA;
可以一次性爆出所有数据库名
DISTINCT
SELECT DISTINCT 列名 FROM 表名;
返回表中此列名下不同的值
COUNT
SELECT COUNT(列名) FROM 表名;
返回指定列下值的数目
CAST
CAST (my_data AS data_type);
将my_data转化为指定数据类型
IFNULL
IFNULL(expression_1,expression_2);
如果表达式1结果不为空则返回表达式1的结果,否则返回表达式2的结果
MID
MID(my_str, start[,length]);
从某表某列中的数据提取指定长度的字符串(从start位置开始(最小值为1)后length长度的字符串)
SUBSTR
SUBSTR(my_str, start[,length]);
同MID,用于截取字符串
LEFT
LEFT(my_str, num)
返回字符串前num个字符
ORD
ORD('inject');
//值为'i'的ASCII值105
返回字符串第一个字符的ASCII值
ASCII
ASCII('inject');
//值为'i'的ASCII值105
返回字符串第一个字符的ASCII值
LIMIT
SELECT * FROM tablename limit i,n;
返回索引从 i 开始的 n 条数据
REGEXP
my_str REGEXP 'regex_expression';
根据SELECT的不同
返回数据或布尔值
如查找所有姓张,后面两个字的学生
检查当前用户是否可能为root
IF
IF(expr,v1,v2)
如果表达式为真则返回v1,为假则返回v2
LENGTH
LENGTH(my_str)
返回字符串长度
GROUP BY
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
根据一个或多个列的值对结果集进行分组
RAND
RAND()
产生一个0到1之间的伪随机数
传入int型参数时以其作为种子,相同参数产生的伪随机数相同
CONCAT
CONCAT(str1, str2, ...)
拼接字符串
FLOOR
FLOOR(num)
向下取整
LOAD_FILE
LOAD_FILE('/this/is/an/example');
读取文件并将其内容作为字符串返回
INTO OUT_FILE
SELECT * INTO OUT_FILE('/this/is/an/example') FROM tablename;
将表中所有行写入指定文件,也可与 LINES TERMINATED BY 搭配写入自定义内容