PHP手动注入实验Word文档格式.docx
《PHP手动注入实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《PHP手动注入实验Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
![PHP手动注入实验Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/11/3d976713-aac0-4aca-ac3b-c87449250ac2/3d976713-aac0-4aca-ac3b-c87449250ac21.gif)
SQL注入是从正常的WWW端口通过对页面请求访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙很少会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
一般来说注入攻击常采用的步骤有发现SQL注入位置、判断后台数据库类型、获取管理员权限,此外在得到网站管理员权限后还可以通过发现虚拟目录、上传木马等手段获取服务器的系统权限。
1.2注入原理概述
SQL是一种用于关系数据库的结构化查询语言。
它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。
SQL语言可以修改数据库结构和操作数据库内容。
当一个攻击者能够通过往查询中插入一系列的SQL操作数据写入到应用程序中去,并对数据库实施了查询,这时就已经构成了SQL-Injection。
目前使用的各种数据库如access、SQLServer、mySQL、Oracle等都支持SQL语言作为查询语言,因此,若程序员在编写代码的时候没有对用户输入数据的合法性进行判断,有可能导致应用程序的安全隐患,攻击者根据返回的结果,获得某些想得知的数据。
1.3Access数据库的注入原理
Access数据库的注入就是提交SQL语句,然后根据返回信息来判断是否正确,从而获得数据库中有价值的内容,其主要是通过猜解得过程来实现注入。
第一步确定注入点:
通常用“and1=1”或者“and1=2”等来确认(注意:
and两边各有一处空格)。
若第一个语句后页面正常显示,第二个语句执行后出现错误信息,整个SQL查询语句变为了SQL=”select*from表名whereid=”xxand1=2或SQL=”select*from表名whereid=”xxand1=1的永真、永假条件,那说明该网站存在SQL注入。
第二步猜解表名
一般程序员在创建数据库时会根据意义来命名,所以需要找到管理员信息时可以尝试检测是否存在admin表,admin这个表名可以替换成其它的表名(如user、manage等表)进行猜解如果存在该表名返回页面结果为正常页面,如果不存在则返回为出错信息。
常用的SQL语句为
and0<
>
(selectcount(*)fromadmin)
第三步猜解某表名中存在的字段
知道表段名后,再查看表中是否有常用字段,一般感兴趣的都是类似用户名、密码的字段,进行猜解后如果返回正常内容,表示存在某个字段,否则为出错信息。
常用的SQL语句为:
1=(selectcount(*)from表名wherelen(pass)>
0)(判断是否有pass字段),猜测字段时有可能需要重复以上步骤数次才能找到合适的字段名。
第四步猜测字段内容
这是比较复杂的一步,猜测字段内容也可以使用SQL构造语句,例如常用到得SQL语句:
and(selecttop1asc(mid(usernameN1))fromAdmin)>
0。
猜解第N位的ASCII码>
0取值从负数到正数都有可能,当然常见的密码都是数字加字母的组和,它们的ASCII值在0-128之间,将值替换为这之间的值,如果正确,则返回正常页面,如果不是则返回出错,将N分别替换为1、2、3、4……反复猜解即可得出字段每一个位数的值而得到密码,参数N为字段的位数,如果是(mid(username11)),则查找username字段中的第一位,依此类推。
整个语句的最右边“>
0”,数字0表示的是ASCII码,并不是真正的字段位数相应的字符。
SQL注入一般分为手工注入和工具注入两种,手工注入需要攻击者自行构造SQL语句实现注入,工具注入对于初学者来说要简单得多,例如:
网络上流行的阿D,明小子等注入工具都是依据相同原理而设计的。
第五步:
管理员身份登陆
以管理员用户身份登陆:
一般来说查找管理员入口是手动注入的一个难点,有的网站上在页面首先会显示管理员入口的链接,此时只需要在管理员页面输入猜测得到的管理员用户名和密码,即可登陆。
但若管理员入口不明,则需要通过尝试的方法获取,这种尝试是一种经验的尝试。
例如admin页面,adminlogin页面、admin/admin页面等。
1.4SQLServer注入原理
SQLServer数据库的注入与access数据库注入有相似之处,只是其攻击的方式更为多种多样。
首先可以通过服务器IIS的错误提示来鉴别数据库类型,在地址栏最后输入“‘”,如果是access数据库那么会返回MicrosoftJETDatabaseEngine错误’80040e14’;
若是SQLServer数据库,返回MicrosoftOLEDBProviderforOBDCDrivers错误’80040e14’。
同样,如果IIS错误信息提示被关闭,可以通过猜测是否存在系统表,例如sysobjects表等来判断数据库类型。
此外,由于SQLServer数据库存在帐户权限,所以如果发现有sa权限的注入点,今年改过尝试,可通过上传或写入配置文件等方法获得webshell得到服务器的控制权限,从而拿到服务器的系统权限。
1.5PHP注入原理
php注入与asp注入还是有区别的,我们要进行的是跨表查询要用到UNION.UNION是连接两条SQL语句,UNION后面查选的字段数量、字段类型都应该与前面SELECT一样.通俗点说如果查寻对的话就出现正常的页面.在SQL语句中,可以使用各种MySQL内置的函数,经常使用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()这些函数来获取一些系统的信息,例如:
load_file(),该函数的作用是读入文件,并将文件内容作为一个字符串返回。
如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。
php注入就是利用变量过滤不足造成的看看下面两句SQL语句:
①SELECT*FROMarticleWHEREarticleid='
$id'
②SELECT*FROMarticleWHEREarticleid=$id
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同之处。
①指定变量$id为:
1'
and1=2unionselect*fromuserwhereuserid=1/*
此时整个SQL语句变为:
SELECT*FROMarticleWHEREarticleid='
and1=2unionselect*fromuserwhereuserid=1/*'
②指定变量$id为:
1and1=2unionselect*fromuserwhereuserid=1
SELECT*FROMarticleWHEREarticleid=1and1=2unionselect*fromuserwhereuserid=1
看出来了吗?
由于第一句有单引号,我们必须先闭合前面的单引号,这样才能使后面的语句作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样才可以成功注入,如果php.ini中magic_quotes_gpc设置为on或者变量前使用了addslashes()函数,我们的攻击就会化为乌有,但第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就OK了。
通常PHP注入的步骤如下:
1)先查看是否存在漏洞
2)判断版本号以决定是否可以用union连接,andord(mid(version(),1,1))>
51/*
3)利用orderby暴字段,在网址后加orderby10/*如果返回正常说明字段大于10
4)再利用union来查询准确字段,如:
and1=2unionselect1,2,3,......./*直到返回正常,说明猜到准确字段数。
如过滤了空格可以用/**/代替。
5)判断数据库连接帐号有没有写权限,and(selectcount(*)frommysql.user)>
0/*如果结果返回错误,那我们只能猜解管理员帐号和密码了。
6)如果返回正常,则可以通过and1=2unionselect1,2,3,4,5,6,load_file(char(文件路径的ascii值,用逗号隔开)),8,9,10/*注:
load_file(char(文件路径的ascii值,用逗号隔开))也可以用十六进制,通过这种方式读取配置文件,找到数据库连接等。
7)首先猜解user表,如:
and1=2unionselect1,2,3,4,5,6....fromuser/*如果返回正常,说明存在这个表。
8)知道了表就猜解字段,and1=2unionselect1,username,3,4,5,6....fromuser/*如果在2字段显示出字段内容则存在些字段。
9).同理再猜解password字段,猜解成功再找后台登录。
10)登录后台,上传shell
2、防御技术
从前面讲述的原理可以看出,在数据没有经过服务器处理之前就进行严格的检查,才是最根本防御SQL注入的方法。
对提交数据进行合法性检查得方法来过滤掉SQL注入的一些特征字符,也可以通过替换或删除敏感字符/字符串、封装客户端提交信息、屏蔽出错信息等方法来修补漏洞、防止SQL注入。
例如:
admin1=replace(trim(request(“admin”)),”’”,””)
password1=replace(trim(request(“password”)),”’”,””)
这两句语句就过滤掉SQL语句提交时的’号。
此外,也可以通过给用户密码加密的方法,增加破解的难度,例如使用MD5加密,这样即使获取了密码也是加密后的密码,无法获取原始密码。
实验要求
●认真阅读和掌握本实验相关的知识点。
●得到实验结果,并加以分析生成实验报告。
∙注:
因为实验所选取的软件版本不同,学生要有举一反三的能力,通过对该软件的使用能掌握运行其他版本或类似软件的方法。
实验步骤
1、首先,启动“开始”菜单中的wampserver。
如图3-25启动wampserver
图3-25启动wampserver
2.修改WAMP的端口:
打开“托盘”中的WAMP5.1.7.4中的configfile里的httpd.conf文件,将下图中涂黑区域按下图所示进行修改。
如图3-26修改端口1