SQL注入成因
开发者在开发过程中,直接将URL的参数、HTTP体中的post参数或(Cookies, UserAgent)等与SQL语句进行了拼接,造成了hack对于待执行的sql语句的可控。
常见SQL注入
1.联合查询注入(适用于有回显的get请求)
$id = $_GET['id'];
$getid = "select id from users where user_id = '$id'";
$result = mysql_query($getid);
可以输入 id 为 -1'union all select 1 #
2.报错注入(应用系统未屏蔽数据库错误函数,回显了数据库错误信息)
1)rand(0) group by
2)updatexm( )
3)floor( )
4)exp( )
3.Bool盲注(当开发者屏蔽了错误信息,但网页对于真假有不同回显)
利用substr(str, start, length)=x,或 left(str, length)=x,逐位判断想要获取的参数,多数时候可以搭配ascii( ), hex( )函数来避免单引号使用。
4.时间盲注(当网页对于真假的回显不明显时使用)
使用sleep( )或者benchmark( )函数,搭配 if( )、与Bool( )来将判断的真假更直观的展示
5.二次注入(针对了用户注册或者类似的应用场景)
例如,你在注册用户或者发布评论时使用了SQL语句,他在第一次获取时进行了过滤处理,但当你第二次调用该参数时(例如更新密码,别人举报、收藏该评论)服务端未再次对该参数进行过滤处理。
SQL注入点找寻方法
1.常见的注入点位置
1)get参数中的注入
通过观察地址栏的URL尝试手工验证,或者使用sqlmap扫描
2)post参数中的注入
需要通过抓包软件或者浏览器插件进行观察验证,或者使用sqlmap扫描
3)User-Agent中的注入
使用Burp中的Repeater模块手工验证或者sqlmap(level 3)自动扫描
4)Cookie中的注入
使用Burp中的Repeater模块手工验证或者sqlmap(level 2)自动扫描
2.判断注入点是否存在
1)字符型数据
插入单、双引号,观察是否造成引号未闭合的错误
2)数字型数据
对于后方的数字进行操作(例如将http://example.com/?id=2,修改为…id=3-1,观察结果是否相同)
SQL注入尝试技巧:
1)可回显注入
- 进行联合查询注入
- 报错注入
- 通过注入进行DNS请求,达到回显效果
2)不可回显注入
- Bool盲注入
- 时间注入
3)二次注入
绕过技巧:
1.针对过滤关键词(例如对于select、or、from关键词的过滤)
1)对于未进行递归过滤的(尝试穿插关键词进行绕过selselectect、oorr)
2)通过大小写转化(SelEct、Or)
3)对于十六进制过滤的(将个别字母进行替换 selec\x74、o\x72)
4)进行双重URL编码(将form编码为url格式,再将得到的url编码继续进行url编码)
2.针对过滤空格
1)使用注释符或换行符 /**/或者一个 Tab
2)通过URL编码绕过 (%20或者二次URL%2520)
3)通过空白字符(换行符)绕过(每个数据库中的都有其对应的十六进制换行符)
4)利用特殊符号反引号、加号等(select`user`,`password`from)
5)科学计数法绕过
3.单引号绕过
对于文件名使用十六进制数表示