课程编写 | ||
类别 | 内容 | |
实验课题名称 | PHP手动注入实验 | |
实验目的与要求 | 1.通过手动注入PHP页面,获取password字段名。 2.了解PHP手动注入的基本原理。 3.了解PHP手动注入的过程和基本常用SQL指令。 | |
实验环境 | VPC1(虚拟PC) | Windows XP系统 |
VPC1连接要求 | PC网络接口,本地连接与实验网络直连。 | |
软件描述 | IE浏览器或Firefox浏览器 | |
实验环境描述 | 1、学生机与实验室网络直连; 2、VPC1与实验室网络直连; 3、学生机与VPC1物理链路连通; | |
预备知识 | 1. SQL注入原理介绍
1.1 什么是SQL注入 SQL注入是指攻击者通过在应用程序中预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询。这类应用程序一般是网络应用程序,它允许用户输入查询条件(一般是在浏览器地址栏进行,通过正常的www端口访问),并将查询条件嵌入SQL请求语句中,发送到该应用程序相关联的数据库服务器中去执行。通过构造一些畸形输入,攻击者能够操作这种请求语句去猜解未授权的内容,也就是SQL Injection,SQL注入。 SQL注入是从正常的WWW端口通过对页面请求访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙很少会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。 一般来说注入攻击常采用的步骤有发现SQL注入位置、判断后台数据库类型、获取管理员权限,此外在得到网站管理员权限后还可以通过发现虚拟目录、上传木马等手段获取服务器的系统权限。
1.2 注入原理概述 SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。SQL语言可以修改数据库结构和操作数据库内容。当一个攻击者能够通过往查询中插入一系列的SQL操作数据写入到应用程序中去,并对数据库实施了查询,这时就已经构成了SQL-Injection。 目前使用的各种数据库如access、SQL Server、my SQL、Oracle等都支持SQL语言作为查询语言,因此,若程序员在编写代码的时候没有对用户输入数据的合法性进行判断,有可能导致应用程序的安全隐患,攻击者根据返回的结果,获得某些想得知的数据。
2. PHP注入原理 php注入与asp注入还是有区别的,我们要进行的是跨表查询要用到UNION.UNION是连接两条SQL语句,UNION后面查选的字段数量、字段类型都应该与前面SELECT一样.通俗点说如果查寻对的话就出现正常的页面. 在SQL语句中,可以使用各种 MySQL内置的函数,经常使用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、 CURRENT_USER()这些函数来获取一些系统的信息,例如:load_file(),该函数的作用是读入文件,并将文件内容作为一个字符串返回。如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。 php注入就是利用变量过滤不足造成的 看看下面两句SQL语句: ① SELECT * FROM article WHERE articleid='$id' ② SELECT * FROM article WHERE articleid=$id 两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同之处。 ① 指定变量$id为: 1' and 1=2 union select * from user where userid=1/* 此时整个SQL语句变为: SELECT * FROM article WHERE articleid='1' and 1=2 union select * from user where userid=1/*' ② 定变量$id为: 1 and 1=2 union select * from user where userid=1 此时整个SQL语句变为: SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1 看出来了吗?由于第一句有单引号,我们必须先闭合前面的单引号,这样才能使后面的语句作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样才可以成功注入,如果php.ini中magic_quotes_gpc设置为on或者变量前使用了addslashes()函数,我们的攻击就会化为乌有,但第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就OK了。
3.步骤: 通常PHP注入的步骤如下: 1) 先查看是否存在漏洞 2) 判断版本号以决定是否可以用union连接,and ord(mid(version(),1,1))>51 /* 3) 利用order by 暴字段,在网址后加 order by 10 /* 如果返回正常说明字段大于10 4) 再利用union来查询准确字段,如: and 1=2 union select 1,2,3,......./*直到返回正常,说明猜到准确字段数。如过滤了空格可以用/**/代替。 5) 判断数据库连接帐号有没有写权限,and (select count(*) from mysql.user)>0 /*如果结果返回错误,那我们只能猜解管理员帐号和密码了。 6) 如果返回正常,则可以通过and 1=2 union select 1,2,3,4,5,6,load_file(char(文件路径的ascii值,用逗号隔开)),8,9,10 /* 注:load_file(char(文件路径的ascii值,用逗号隔开))也可以用十六进制,通过这种方式读取配置文件,找到数据库连接等。 7) 首先猜解user表,如: and 1=2 union select 1,2,3,4,5,6.... from user /* 如果返回正常,说明存在这个表。 8) 知道了表就猜解字段,and 1=2 union select 1,username,3,4,5,6.... from user/*如果在2字段显示出字段内容则存在些字段。 9) .同理再猜解password字段,猜解成功再找后台登录。 10) 登录后台,上传shell
4. 防御技术 从前面讲述的原理可以看出,在数据没有经过服务器处理之前就进行严格的检查,才是最根本防御SQL注入的方法。对提交数据进行合法性检查得方法来过滤掉SQL注入的一些特征字符,也可以通过替换或删除敏感字符/字符串、封装客户端提交信息、屏蔽出错信息等方法来修补漏洞、防止SQL注入。例如: admin1=replace(trim(request(“admin”)),”’”,””) password1=replace(trim(request(“password”)),”’”,””) 这两句语句就过滤掉SQL语句提交时的’号。 此外,也可以通过给用户密码加密的方法,增加破解的难度,例如使用MD5加密,这样即使获取了密码也是加密后的密码,无法获取原始密码。 | |
实验内容 | 通过手动注入PHP页面,获取password字段名。 | |
实验步骤 | 1.学生单击 “网络拓扑”进入实验场景,单击 “打开控制台”按钮,进入目标主机。如图所示: 2.使用默认用户名:administrator,密码:123456登录windows xp系统。 3.点击桌面上的ie浏览器: 4.在地址栏输入http://localhost:8080/index.php?id=1,此时显示出相关信息。 5.探测是否有注入漏洞 在地址栏后加入and 1=1或者and 1=2,查看页面情况,如果页面无异常,表示存在注入,否则需要进一步探测是否存在漏洞。
6.确定mysql的版本 在地址后加上and ord(mid(version(),1,1))>51 /* 返回正常说明是4.0以上版本,可以用union查询
7.断定数据库连接帐号有没有写权限 通过尝试数据库连接时使用的用户名、密码是否在表中,判断是否对数据库有写的权限。 操作方法,在网址后加入and (select count(*) from mysql.user)>0,若返回正确,则拥有该权限,若返回错误,则需要重新猜测管理员名称和密码。
8.猜测管理员表 在网址后加union select count(*)from admin,判断管理员表是否叫admin,如果返回正常,说明存在这个表;若返回错误,则需要重新猜测表名。 猜数据表中字段数
9.猜数据表中字段数量 在网址后加and 1=1 union select 1,2,3,….,n。前面的and 1=1或1=2都可以,主要是为了连接后面的union语句;后面的1,2,3,….n主要用于标记有几个字段,如果字段不符合,就会报错。下图中的结果显示正常,表明访问的数据表中共有三个字段:
10.猜测字段名 与asp注入不同,在猜测字段的时候如果字段猜测成功,PHP会直接显示字段的内容,而不需要再猜测字段内容。操作方式:在网址后加入and 1=1 union select 1,password,3 from admin猜测是否有password字段,如果有则显示其内容。从图中看到,因为只有1条记录,所以password的内容已经显示出来了,如果没有这个字段,则会报错,若没有记录则返回空。 11、实验完毕,关闭虚拟机,退出实验平台。 |