SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
对于初学者而言,找漏洞最好是基于白盒审计进行,所谓白盒审计可以简单地理解为就是看着代码找漏洞,当然了,在web方面的代码审计可没想象的那么轻松,不会像C语言中很经典的溢出,先定义一个buffer,然后用一个gets()函数直接获取内容,这么简单的溢出,泥萌也太小瞧程序媛/猿了。在web方面的代码审计,感谢伟大的社会主义社会,我国大部分的网站都是php建的(画外音:php是世界是最好的语言,哈哈),所以大多数情况下我们都是审计php代码,php函数又那么多,相互之间互相调用,使得代码审计不容易,当然了,也不难,只要掌握了技巧,结合经验,就能找出漏洞所在。
在正式挖洞前,我们先看看DVWA给出的四种级别的SQL注入的源代码。
0x01基于dvwa的代码审计
初学者接触到入门级别的代码审计的内容。
<img src="https://pic4.zhimg.com/50/v2-6e4b867c911db6c2464986a7dc80a907_hd.jpg" data-rawwidth="558" data-rawheight="337" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic4.zhimg.com/v2-6e4b867c911db6c2464986a7dc80a907_r.jpg">
DVWA使用界面
<img src="https://pic1.zhimg.com/50/v2-1e3f4aaed6e5d767c3eb6418b4108c65_hd.jpg" data-rawwidth="558" data-rawheight="333" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic1.zhimg.com/v2-1e3f4aaed6e5d767c3eb6418b4108c65_r.jpg">
SQL注入(SQL Injection)
<img src="https://pic2.zhimg.com/50/v2-f3e8a0e868afc50d40fb298ac3cdb384_hd.jpg" data-rawwidth="558" data-rawheight="337" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-f3e8a0e868afc50d40fb298ac3cdb384_r.jpg">
在左下角的DVWA Security可以调节难度系数,即low,medium,high,impossible选中后点击submit提交即可。
<img src="https://pic2.zhimg.com/50/v2-7829c4dbf805da8e74ddfeaf713d8fe2_hd.jpg" data-rawwidth="558" data-rawheight="439" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-7829c4dbf805da8e74ddfeaf713d8fe2_r.jpg">
点击左下角view source可以看到源代码,方便进行代码审计
我们可以看到四种级别的代码分别如下所示:
代码:
<img src="https://pic2.zhimg.com/50/v2-7829c4dbf805da8e74ddfeaf713d8fe2_hd.jpg" data-rawwidth="558" data-rawheight="439" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-7829c4dbf805da8e74ddfeaf713d8fe2_r.jpg">
低级(low)
分析:
关键语句:
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
可以看到:
Low级别的代码对来自客户端的参数id没有进行任何的检查与过滤,存在明显的SQL注入。
<img src="https://pic1.zhimg.com/50/v2-84553979b0813e1b4b4947a73dd4a25a_hd.jpg" data-rawwidth="558" data-rawheight="455" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic1.zhimg.com/v2-84553979b0813e1b4b4947a73dd4a25a_r.jpg">
中级(medium)
分析:
关键代码:
$id = mysql_real_escape_string( $id );
// Check database
$query = "SELECT first_name, last_name FROM
users WHERE user_id = $id;";
可以看到:
Medium级别的代码利用mysql_real_escape_string函数对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义,在一定程度上控制了用户的输入
<img src="https://pic2.zhimg.com/50/v2-483df6b63eae4f384afedab493b315a0_hd.jpg" data-rawwidth="558" data-rawheight="451" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-483df6b63eae4f384afedab493b315a0_r.jpg">
高级(high)
分析:
关键语句:
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id
LIMIT 1
可以看到:
代码希望通过LIMIT 1来控制使得只输出一个查询结果
<img src="https://pic3.zhimg.com/50/v2-8b3eb650f984bbe448ce6bd4e51bce0d_hd.jpg" data-rawwidth="558" data-rawheight="463" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic3.zhimg.com/v2-8b3eb650f984bbe448ce6bd4e51bce0d_r.jpg">不可能(Impossible)
分析:
关键代码:
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
可以看到:
代码中限制返回的查询结果数量为一时,才会输出,防止了大量数据的泄露,同时采用了PDO技术,隔离了代码与数据,使得用户输入的数据不再被当作代码执行,采用这种方案,杜绝了SQL注入漏洞的发生
0x02挖掘漏洞
注:
1.接下来的过程中会大量用到sqlmap,部分站点的漏洞将直接以sqlmap的形式给出。所以建议小伙伴先去熟悉下sqlmap。
2. 以下提交的漏洞均已被厂家修复,小伙伴们就不要想搞事情了
3.本文展现的漏洞在测试前已获授权,请小伙伴们勿非法测试
先来枚有web页面的漏洞:
<img src="https://pic1.zhimg.com/50/v2-327cee14557ba9bfdaddfe5569ffb96e_hd.jpg" data-rawwidth="558" data-rawheight="275" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic1.zhimg.com/v2-327cee14557ba9bfdaddfe5569ffb96e_r.jpg">存在漏洞的页面
扫目录时发现该url下存在某事件型漏洞
<img src="https://pic2.zhimg.com/50/v2-e5e9cb09be18f7dcc736f3953fe9261f_hd.jpg" data-rawwidth="558" data-rawheight="224" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-e5e9cb09be18f7dcc736f3953fe9261f_r.jpg">采用某位大神的中转脚本:
<img src="https://pic1.zhimg.com/50/v2-560c14f151f86dae3c8bd524bc4ef6aa_hd.jpg" data-rawwidth="558" data-rawheight="438" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic1.zhimg.com/v2-560c14f151f86dae3c8bd524bc4ef6aa_r.jpg">
通过sqlmap神器成功挖到漏洞
<img src="https://pic3.zhimg.com/50/v2-0cebb2d6d9d0c45b7582b0499b37aa00_hd.jpg" data-rawwidth="558" data-rawheight="188" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic3.zhimg.com/v2-0cebb2d6d9d0c45b7582b0499b37aa00_r.jpg">
拿到的数据库
<img src="https://pic1.zhimg.com/50/v2-da4ce609e39d958569c9be98eaa150a0_hd.jpg" data-rawwidth="226" data-rawheight="154" class="content_image" width="226">
Sqlmap测试时截图
<img src="https://pic2.zhimg.com/50/v2-c5773b1011ee0a556c33b922f7db7c07_hd.jpg" data-rawwidth="558" data-rawheight="123" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-c5773b1011ee0a556c33b922f7db7c07_r.jpg">
总结:第一枚漏洞主要是采用某事件型漏洞结合sqlmap挖到的,难度相当于DVWA中的Medium级别
什么?没有数据看着不过瘾?你这是要搞事情啊大兄弟!好吧,再来一枚数据量大的
第二枚漏洞:
测试时没有截web的图,只有sqlmap,将就着看吧,看看
<img src="https://pic3.zhimg.com/50/v2-169107c17d9391a76365209db94ef5ca_hd.jpg" data-rawwidth="533" data-rawheight="39" class="origin_image zh-lightbox-thumb" width="533" data-original="https://pic3.zhimg.com/v2-169107c17d9391a76365209db94ef5ca_r.jpg">
存在漏洞的站点
Sqlmap扫一发
<img src="https://pic1.zhimg.com/50/v2-b226ac6624a57ccab9b1322d94db041a_hd.jpg" data-rawwidth="558" data-rawheight="547" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic1.zhimg.com/v2-b226ac6624a57ccab9b1322d94db041a_r.jpg">
加个—tables继续
<img src="https://pic3.zhimg.com/50/v2-add5b245b78234684e8ffe8a17e05af0_hd.jpg" data-rawwidth="558" data-rawheight="612" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic3.zhimg.com/v2-add5b245b78234684e8ffe8a17e05af0_r.jpg">
就拿上张图的mallbuilder来开刀吧
<img src="https://pic3.zhimg.com/50/v2-bac5669f33d7b1b36baf9a3e7c102ad1_hd.jpg" data-rawwidth="468" data-rawheight="690" class="origin_image zh-lightbox-thumb" width="468" data-original="https://pic3.zhimg.com/v2-bac5669f33d7b1b36baf9a3e7c102ad1_r.jpg">
继续—current-db
<img src="https://pic4.zhimg.com/50/v2-60980fb9ea51e5a403b8597e181d4ce7_hd.jpg" data-rawwidth="558" data-rawheight="588" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic4.zhimg.com/v2-60980fb9ea51e5a403b8597e181d4ce7_r.jpg">
<img src="https://pic2.zhimg.com/50/v2-f7a90a3527b42e82b751d02eed1a7cf8_hd.jpg" data-rawwidth="558" data-rawheight="745" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-f7a90a3527b42e82b751d02eed1a7cf8_r.jpg">
红色打码的部分是手机号或真实姓名或邮箱号,过于敏感就打码了,可以看到图中下面password就是密码编码加密后的字符串
拿到用户名和密码后我们可以登陆后台
<img src="https://pic2.zhimg.com/50/v2-1dbf49866c881fdf49f6fee7d0cd6015_hd.jpg" data-rawwidth="558" data-rawheight="280" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic2.zhimg.com/v2-1dbf49866c881fdf49f6fee7d0cd6015_r.jpg">
红色打码部分为收货人姓名及手机号,有一条还包括收货地址
红色打码部分为手机号
<img src="https://pic1.zhimg.com/50/v2-43bf5cfbaaec423bc192ddfc971cd00a_hd.jpg" data-rawwidth="558" data-rawheight="267" class="origin_image zh-lightbox-thumb" width="558" data-original="https://pic1.zhimg.com/v2-43bf5cfbaaec423bc192ddfc971cd00a_r.jpg">
可以看到后台所有的功能我们都是可以使用的,就不继续了
总结:通过简单的sqlmap命令指定特定的表、数据库来“脱裤”,拿到后台登陆帐号密码,进而进行进一步的操作。此站点的代码强度相当于DVWA中的Medium级别.