当先锋百科网

首页 1 2 3 4 5 6 7

先来讨论下SQL注入的定义,其实目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述:

  1. 脚本注入式的攻击 
  2. 恶意用户输入用来影响被执行的SQL脚本

SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,实质就是将恶意的SQL代码注入到特定字段用于实施拖库攻击等。SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL语句。SQL注入是网站渗透中最常用的攻击技术,但是其实SQL注入可以用来攻击所有的SQL数据库。以前我听到的比较多的就是ASP注入,PHP注入,其实根本没有这种说法,SQL注入攻击是针对数据库的!

对于注入漏洞来说,可能现在很多人认为它已经过时,因为这种漏洞可以被参数化查询而杜绝。以前对这种漏洞的防御方式主要有三种:

  • 字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
  • 字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之鱼。
  • 存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通过拼接字符串出来的,还是会有漏洞。

还有一种近几年出现的参数化查询,这些大概了解一下,有兴趣的到网上自行搜索。


本次用的是dvwa平台。

LOW实验的关键代码:

这是我觉得最简单的一种注入情况了,什么防护都没有,直接上就行。建议做的时候不要用工具,最好能自己手工测试,一步一步拿到数据,以后熟悉了可以再用工具做。

再看下medium实验的关键代码:

加了一个函数,也是过滤函数,这个函数再这几种常见的WEB攻击中的出镜率非常高,其他实验也对他进行了说明。

 ID等于1的时候可以正常回显。

测试是否存在注入。

and 1=1可以正常回显。

这里直接返回了首页,和and 1=1返回的页面不一样,原理是把测试语句代入到了数据库查询,and就是逻辑运算,1=1为真,1=2为假,所以返回不同,要自己去理解。还有好多其他测试方法,这里不再讨论,先理解这两个就行。

根据上面的测试过程,最终要求你拿到数据库的用户名和密码。首先通过报错拿到数据库名等基本信息,然后是表名列名,再拿到数据库。第一步先得到字段数。


字段数已经判断出来,下面如何进一步判断数据库名和用户名等基本信息。

利用语句查询知道有两个字段,接着查询数据库名和用户。

查询数据库等基本信息。

UNION SELECT 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version())


如果是Mysql数据库,更多时候要用到它的系统函数,有时候可以达到事半功倍的效果。

查询表段。

union select 1,table_name from information_schema.tables where table_schema=0x64767761(数据库的十六进制)

查询列名。

union select 1,column_name from information_schema.columns where table_name=0x7573657273(表的十六进制) and table_schema=0x64767761(数据库的十六进制)

 

查询用户名密码。

union select password,user from users