SQL注入点小结
什么是SQL注入点
所谓注入点就是可以实行SQL注入的地方,通常是一个访问数据库的连接。根据注入点数据库的运行帐号的权限的不同,你所得到的权限也不同。
注入点好比化作一条大街.小偷或者流浪汉顺着大街走.发现有一家大门没有关.进去后找到可以拿的东西卖出去.很多网站被黑无非是找到注入点拿到网站后台然后找出管理员账号密码来进行登录.登陆成功后百分之八十都会用到一句话木马.得到网站的webshell.得到了服务器提权后远控。
如何寻找注入点
通过搜索引擎搜索注入点
要想应用SQL注入首先要做的就是找注入点,国内的网站通过各种搜索引擎可以方便的搜索到注入点。
搜索关键字: 目的关键字+ in:asp (意义:搜索含有目的关键字,并且网址中含有asp网页)
例如: 科技 in:asp
注: 如果搜索的是aspx(或PHP)的, asp换成aspx(或PHP)就可以了,以下雷同。
英语字母及单词
例如: a in:asp phone in:asp box in:asp
数字
例如: 0 in:asp 8080 in:asp 2015 in:asp
网站域名
例如: com in:asp JP in:asp cn in:asp
还有很多人用搜索引擎搜索出的常用注入点,在网上都可以找到。
这是一篇常用的注入关键字的地址:
http://wenku.baidu.com/link?url=PAyAtAiivMhBETtbwcGiIMGn4ztaCkW9CN9Qbm7kK_TnwKYrbqXcRYGlkS24lxB6ygXqkuKcfWjD74tRWb0jcSA6EvVfuoXh2gpXs8SHHKa
搜索型注入点
现在很多的网站系统都过滤了一些普通的注入,但程序员往往疏忽了对搜索功能查询,文本框内的输入和隐藏域内的数据提交变量(参数)的过滤或过滤不全,这样也导致了漏洞的产生。
常见的搜索功能代码如下:
keyword=trim(request.From(“keyword”));
//获取客户端提交在要查询的关键字,并过滤了两边的空格
if (StringUtil.isEmpty(keyword))
{
response.Write “alert(‘查询内容不能为空!’);history.back(-1);”
//如果关键字为空,则输出下面的”查询内容不能为空!’”
} else{
//JDBC
//执行select语句
//”select * from tablename where name like ‘%”&keyword”%’ oeder by id desc”
}
这段代码中,开发人员对用户所要查询的内容进行了简单的过滤,仅仅只是StringUtil.isEmpty(keyword)这样判断,并没有对其余字符或者参数进行过滤,从而留下了严重的安全隐患。
在NET或者WEB应用程序中,多数实现搜索功能的模块,大多为%search%.asp、%search%.html、%search%.jsp等,如果在系统代码中发现了类似的网页就可以开始进行SQL注入尝试了。
亦可在系统中使用搜索功能,使用浏览器的开发者调试模式,进行跟踪,看系统是否调用了类似的页面。
在WEB表单中,表单的提交时也会进行数据库操作以及在URL地址栏中进行参数的传递。
我们可以打开一个网站,在搜索框里输入:
关键字%’ and 1=1 and ‘%’=’
那么在刚才的网站中没有进行参数和字符的过滤的话,这个样的输入是可以正常进行搜索的。所以我们继续在后面输入我们想要执行的sql语句,及可达到SQL语句注入的目的。如果我们继续输入:
关键字%’ and 1=2 and ‘%’=’
这是就会显示搜索结果为空。原因大家很好理解,这是SQL语句中由于and的存才,1=2永为false。
手动搜索注入
手动在搜索中输入字符串的拼接,这些注入攻击的代码和我们平时进行查询的SQl语句代码相同。
工具注入
在工具中,NBSI和HDSL这二款注入工具都提供了对搜索型的注入漏洞的注入,不过前提是我们要得到注入点,也就是要得到搜索页面的URL地址。
系统在获取用户的提交数据时,有GET和POST这两种的提交数据方式,在request对象中获取GET方法提交的数据对应的集合,而获取POST方法提交的数据对应的集合是From,在实际的代码中,通过POST方法提交数据的时候用得最多,在上面的代码中,大家也可以看到是使用POST方法提交数据的,当然request对象可以不通过集合来获得数据,但它的效率低下,容易出错,在大型系统中一般不使用这种提交的方法,这两种提交数据的方法,最大的不同就是在通过GET方式提交数据的时候,所有的参数及值都是放入URL中的,成为URL的一部分,并显示出来,例如,百度在搜索的时候就是采用这种方式,当我们搜索”中兴”时,就可以看到在浏览器的URL显示了
可以看到在上述的URL包含多种参数,包括中兴经过编码的字符%E4%B8%AD%E5%85%B4
rsv_spt=1
rsv_iqid=0xad89071100005547
issp=1
rsv_bp=0
ie=utf-8
tn=baiduhome_pg
rsv_enter=1
rsv_sug3=10
rsv_sug1=4
rsv_sug2=0
inputT=1303
rsv_sug4=1303
rsv_sug=1
可以看到所有的参数都放在URL中,通过?,&将多有的参数连在一起。
如果系统是采用GET方式提交的搜索,我们只需要把其URL填入工具中就可,不过还要填入可以搜索到的关键字,但在使用POST提交方式时,我们提交的数据在URL中是看不到的,它将表单中的数据放到FROM,这样我们就要自己来手动找出隐藏的变量了,然后再赋予正确的值并正确构造出注入的URL。
通用的SQL注入步骤
- 先判断有没有注入的漏洞
- 先在网站的搜索框中输入要搜索的关键字,先不要点击”搜索”.
- 打开Wesockexpert工具,单击工具条里的”打开进程”按钮,会出现一个进程列表,选择网站的IE进程,点击后打开就可以监视我们提交的数据了,
- 再点击”搜索”,之后,我们在工具界面的框中,选中POST提交的信息包,点击后,就会在下面的框中,就会出现POST提交的参数和相对应的值
- URL的手工修改,修改好后把它填入注入工具里,关于搜索型注入工具,HDSI工具处理的比较好,大家还要注意,由于工具判断注入漏洞的方法只是检测最后的一个变量,因此要把查询的关键字放在URL的最后面才可以检测出来,接下来工具就可以帮我们做想做的事了.
一种新型的SQL注入检测方法
现在有很多防注入程序屏蔽了 and、1=1、1=2 类似这样的关键字,使用这样的方法有时不能探测到注入点了。
那么是否有新的方法能够探测注入点呢? 经过一段时间的研究,发现了更好的方法。哈哈,特此共享一下。
现在假设有一个新闻页面,URL 是 http://..cn/n*.asp?id=123,
1. 在浏览器中打开,可以看到一个正常的新闻页面;
2. 在URL地址后面加上-1,URL变成:http://..cn/n*.asp?id=123-1,如果返回的页面和前面不同,出现了另一个新闻页面,则表示存在注入漏洞,是数字型的。
3. 在URL的地址后面加上’%2B’,URL地址变为:http://..cn/n*.asp?id=123’%2B’,返回的页面和1同;加上’2%2B’asdf,URL地址变为:http://..cn/n*.asp?id=123’%2Basdf,返回的页面和1不同,或者说未发现该条记录,或者错误,则表示存在注入点,是文本型的。
我们可以从程序的角度来考虑一下。程序员的这条语句大致应该是这样的:
select * from news where id=123
当我们在后面加上 -1 后,语句变为
select * from news where id=123-1
SQL服务器在执行这条语句时会进行运算,实际执行的是:
select * from news where id=122
这样选出来的就是另外一条新闻记录了。如果该记录存在,就是另一则新闻;否则会显示记录不存在,或者出错
。呵呵。 这也同时表示程序未对输入的数据进行过滤,存在数值型的注入漏洞。
如果 SQL 语句时这样的:
select * from news where id=’123’
那么我们在后面加上 ‘%2B’ 之后,语句变为
select * from news where id=’123’+”
%2B 是 + 的URL编码。 这样之后,SQL服务器实际执行的是:
select * from news where id=’123’
会返回同样的页面。
加上 ‘%2B’asdf 之后,语句变为
select * from news where id=’123’+’asdf’
实际执行的是:
select * from news where id=’123asdf’
返回页面不存在,或者显错。 这就表示有文本型的注入漏洞。