课程编写

类别

内容

实验课题名称

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手动注入实验的更多相关文章

  1. 搭建sql注入实验环境(基于windows)

    搭建服务器环境 1.下载xampp包 地址:http://www.apachefriends.org/zh_cn/xampp.html 很多人觉得安装服务器是件不容易的事,特别是要想添加MySql, ...

  2. spring xml配置注入改为手动注入过程

    项目中需要使用MQ组件来接受消息,但是有的时候,在使用的时候,并不能满足spring注入的条件,无法注入.例如 在jfinal的config的afterJFinalStart中,由于jfinal集成s ...

  3. dvwa——sql手动注入和sqlmap自动注入

    手动注入 low: 源码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; ...

  4. 20169205 2016-2017-2 实验四 SQL注入实验

    20169205 2016-2017-2 实验四 SQL注入实验 实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框. ...

  5. 20169219 SEED SQL注入实验

    实验环境SEED Ubuntu镜像 环境配置 实验需要三样东西,Firefox.apache.phpBB2(镜像中已有): 1.运行Apache Server:只需运行命令sudo service a ...

  6. 20169219 SQL注入实验报告

    实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框.输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令. 在 ...

  7. Autofac手动注入及自动注入示例

    参考:http://www.cnblogs.com/xinchuang/archive/2013/05/07/3065433.html#2911661 一.环境 vs2012.mvc4..Net Fr ...

  8. SQL注入实验,PHP连接数据库,Mysql查看binlog,PreparedStatement,mysqli, PDO

    看到有人说了判断能否sql注入的方法: 简单的在参数后边加一个单引号,就可以快速判断是否可以进行SQL注入,这个百试百灵,如果有漏洞的话,一般会报错. 下面内容参考了这两篇文章 http://blog ...

  9. JSP手动注入 全

    检测可否注入 http://****.house.sina.com.cn/publics/detail.jsp?id=7674 and 1=1 (正常页面) http://****.house.sin ...

随机推荐

  1. Fedora25 将eclipse的快捷方式添加到Applications中

    [root@localhost Downloads]# vi /usr/share/applications/eclipse.desktop 然后在里面添加如下内容: [Desktop Entry]N ...

  2. 利用pyinotify监控文件内容,像tailf命令但比它更强

    Linux的tail/tailf命令使用了内核提供的inotify功能,下面的Python例子也使用inotify实现比tail/tailf更强的监控文件功能. watchfile.py #!/usr ...

  3. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  4. Java基础二

    1 关键字 定义:被java语言赋予了特殊含义的单词. 特点:关键字中的所有字母都为小写. 用于定义数据类型的关键字 class.interface.byte.short.int.long.float ...

  5. go web 第二天 学习笔记之文件上传

    package main import ( "crypto/md5" "fmt" "html/template" "io" ...

  6. JAVA基础----持续更新

    1.基本数据类型   - 整数型:byte  short  int  long   默认为int 计算时需要转换    - 浮点型:float  double     默认为double    - 布 ...

  7. org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML.问题思路

    15:36:34,549 WARN DefaultListableBeanFactory:1416 - Bean creation exception on FactoryBean type chec ...

  8. BackgroundWorker类中主要属性、方法和事件

    属性: 1.CancellationPending             获取一个值,指示应用程序是否已请求取消后台操作.通过在DoWork事件中判断CancellationPending属性可以认 ...

  9. C++异常处理机制

    商业转载请联系作者获得授权,非商业转载请注明出处. 一.什么是异常 -异常是程序中可以检测到的不正常的情况. -示例:被0除.数组越界.存储空间不足等. -早期我们使用if来判断,然后进行相关处理,或 ...

  10. openssl命令

    author:JevonWei 版权声明:原创作品 1.构建根证书 构建根证书前,需要构建随机数文件(.rand),完整命令如 openssl rand -out private/.rand 1000 ...