PHP手动注入实验
课程编写 |
||
类别 |
内容 |
|
实验课题名称 |
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、实验完毕,关闭虚拟机,退出实验平台。 |
PHP手动注入实验的更多相关文章
- 搭建sql注入实验环境(基于windows)
搭建服务器环境 1.下载xampp包 地址:http://www.apachefriends.org/zh_cn/xampp.html 很多人觉得安装服务器是件不容易的事,特别是要想添加MySql, ...
- spring xml配置注入改为手动注入过程
项目中需要使用MQ组件来接受消息,但是有的时候,在使用的时候,并不能满足spring注入的条件,无法注入.例如 在jfinal的config的afterJFinalStart中,由于jfinal集成s ...
- dvwa——sql手动注入和sqlmap自动注入
手动注入 low: 源码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; ...
- 20169205 2016-2017-2 实验四 SQL注入实验
20169205 2016-2017-2 实验四 SQL注入实验 实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框. ...
- 20169219 SEED SQL注入实验
实验环境SEED Ubuntu镜像 环境配置 实验需要三样东西,Firefox.apache.phpBB2(镜像中已有): 1.运行Apache Server:只需运行命令sudo service a ...
- 20169219 SQL注入实验报告
实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框.输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令. 在 ...
- Autofac手动注入及自动注入示例
参考:http://www.cnblogs.com/xinchuang/archive/2013/05/07/3065433.html#2911661 一.环境 vs2012.mvc4..Net Fr ...
- SQL注入实验,PHP连接数据库,Mysql查看binlog,PreparedStatement,mysqli, PDO
看到有人说了判断能否sql注入的方法: 简单的在参数后边加一个单引号,就可以快速判断是否可以进行SQL注入,这个百试百灵,如果有漏洞的话,一般会报错. 下面内容参考了这两篇文章 http://blog ...
- JSP手动注入 全
检测可否注入 http://****.house.sina.com.cn/publics/detail.jsp?id=7674 and 1=1 (正常页面) http://****.house.sin ...
随机推荐
- 定时任务备份数据库与windows批处理
前言: 关于数据库备份的方法有很多,你可以在命令行执行mysqldump命令进行备份,也可以使用数据库管理工具,比如navicat进行数据库的备份. 但是以上数据库的备份都是可以单次备份,总不能要一个 ...
- Struts2学习笔记(五)——Action访问Servlet API
在Strut2中访问Servlet API有三种方式: 1.通过ActionContext访问Servlet API,推荐使用这种,但是这种方案它获取的不是真正的事Servlet API. 步骤: 1 ...
- mysql 时间戳格式化函数FROM_UNIXTIME和UNIX_TIMESTAMP函数的使用说明
我们一般使用字段类型int(11)时间戳来保存时间,这样方便查询时提高效率.但这样有个缺点,显示的时间戳,很难知道真实日期时间. MySQL提供了一个时间戳格式化函数from_unixtime来转换格 ...
- MySql按每日、每周、每月分组统计数据
select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks; select ...
- Oracle日期查询:季度、月份、星期等时间信息
--oracle有关时间信息 Select to_char(sysdate,'Q') from dual;--指定日期的季度 Select to_char(sysdate,'MM') from dua ...
- autoconf添加gcc调试选项
autoconf生成的编译选项默认是"-g -O2".这个"-g"选项将我迷惑了,以为生成了GDB调试所需的信息,所以也就没有管后面的"-O2“选 ...
- jvm系列 (四) ---强、软、弱、虚引用
java引用 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 为什么将引用分为不同的强度 因为我们需要实现这样一种情 ...
- MySQL(七)MySQL常用函数
前言 上一篇给大家介绍了,MySQL常用的操作符其实已经是非常的详细了,现在给大家分享的是MySQL的常用函数.希望对我和对大家都有帮助. 一.字符串函数 1.1.LOWER.lcase(string ...
- java 读写锁详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt124 在java多线程中,为了提高效率有些共享资源允许同时进行多个读的操作, ...
- 教你自己搭建linux邮箱服务器
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt290 现在网络中流行的电子邮件系统主要有Microsoft Exchange ...