sql注入-技巧
1、union联合注入
如果sql语句是select结构,可以尝试联合注入获取信息。
(1)order by n确认查询字段数,n从1开始递增,只有当n等于当前select查询字段数才正常执行sql语句
(2)union select 1,2,3...n,默认查询,确认有输出前端的字段。
- 如果确定是单查询,那么需要将union前的条件置为false
- 如果响应不包含union后的查询,那么推测是单查询,需要将union前的条件置为false
(3)union select version(),user(),database(),查询基本信息
(4)查询具体的数据库表数据
2、布尔盲注
如果无法直接输出查询数据到前端,但是根据条件的不同会有其它不同的状态输出,那么可以进行布尔盲注,利用响应中的反应进行判断。
对于获取的信息,可以作为一个字符串,进行逐字符判断,从而获取整体内容。
3、时间盲注
与布尔盲注原理基本一致,区别在于不是根据响应内容判断,而是根据响应的时间进行判断。
主要利用if函数和sleep函数
4、错误注入
如果服务端将sql应用执行sql语句的sql异常输出到前端,可以利用updatexml等函数输出信息
5、堆栈注入
对于sql语句,通过;关闭当前语句,然后在其后另写sql语句执行。
注意这种方法,后者的sql语句一般不会输出影响前端,所以并不写入select语句。
6、其他
6.1 二次注入
如果某处存在sql注入漏洞,但是因为防护墙等因素无法在该sql语句中写入敏感字符或关键字。而在另外一处可以将敏感字符或关键字写入保存到数据库中,同时在存在sql注入处,有读取保存的数据作为变量使用,因此结合利用。
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
6.2 宽字节注入
一般,网站程序和mysql都是统一使用utf-8编码,不会出现宽字节注入。
但是如果两者不一致,那么就有可能在网站程序中检查输入是作为宽字节被允许,但是数据库中是单字节编码,造成被允许的宽字节字符拆分成多个单字节字符,就有可能在sql语句中突然出现单引号、双引号、空格等敏感字符