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 ...
随机推荐
- Session的引入以及Cookie的不足
一.为什么引入session > Cookie实际上就是一个头. > 服务器会创建Cookie,并且将Cookie以一个响应头的形式发送给浏览器 > 浏览器收到Cook ...
- java api1.8中文版(由谷歌,百度,有道,必应翻译).md
大家如果想看java1.8 的中文api可以点击我下面提供的链接,同时感谢把这些资源放到网上供我们学习的朋友,废话不说了下面就是链接: java 1.6 帮助文档 中文 链接:http://downl ...
- eclipse的xml文件提示templates的模板.md
eclipse的xml文件提示templates的模板 <?xml version="1.0" encoding="UTF-8" standalone=& ...
- 如何将Windows7系统中“运行”历史记录全部清除
如何将Windows7系统中“运行”历史记录全部清除.. 如何将Windows7系统中“运行”历史记录全部清除 1.任务栏空白处按下鼠标右键,在右键菜单栏中选择“属性”, 2.切换到“开始菜单”选项卡 ...
- Windows常用的一些DOS命令整理
Windows常用的一些DOS命令整理.. MS DOS 命令大全 ---清空Dos屏幕使用命令:cls -- Dos切换当前目录到D盘:cd d: 一.基础命令 1 dir 无参数:查看当前所在目录 ...
- Windows10-安装笔记
Windows10-安装笔记... ------------------------------ ---------------------------------------- 加载镜像.加载完后. ...
- Akka(21): Stream:实时操控:人为中断-KillSwitch
akka-stream是多线程non-blocking模式的,一般来说,运算任务提交到另外线程后这个线程就会在当前程序控制之外自由运行了.任何时候如果需要终止运行中的数据流就必须采用一种任务柄(han ...
- linux下用OCI库访问oracle数据库返回错误Cannot create OCI environment!;
linux下链接oracle数据库,直接用OCI库函数OCI_Initialize初始化返回Oracle ErrorString:Cannot create OCI environment! 原因是缺 ...
- [读书笔记] 三、搭建基于Spring boot的JavaWeb项目
一.POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3. ...
- 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析
异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...