背景
偶遇一从事电商的朋友,闲谈说到了他的电商网站,他不理解自己的网站是如何被破解的,问我能否帮忙看看他的网站存在哪些安全漏洞,说实话当时偶并没有研究过网站破解及安全防护,也是一时兴起抱着学习的态度答应了朋友。
目标:
寻找网站漏洞获取后台数据,提供修复建议
工具及手段:
google、UE、Sqlyog、SQL注入
方式方法:
1、了解目标网站
访问朋友网站,通过网站风格、网页后缀、版权信息等判断网站为基于开源EC-SHOP进行简单整合后部署的,开发语言php,版本号v2.5.0。
2、搜索资料
通过google搜索ec-shop介绍及其漏洞,下载ec-shop程序,网上公布了很多ec-shop的漏洞,主要利用SQL注入的方式。
搜索到user.php页面存在注入漏洞,//xxx.com/user.php?act=order_query&order_sn=21,其中order_sn并没有对字符进行检查,可以通过构造特殊字符如:user.php?act=order_query&order_sn=',其中构造的参数为英文单引号,页面会返回sql错误提示。
3、搭建测试环境
工欲善其事必先利其器,我们不能上来就拿朋友的网站开火,还是自己搭建一个学习学习,当然如果需要的话,还可能要读一下源代码,以便找到更好的构造方法。
在网上下载到ecshop的程序,结合安装部署说明在本地搭建ec-shop测试环境。
4、利用漏洞进行安全测试
使用在google上搜索到的常用漏洞进行试验,
访问//localhost/user.php?act=order_query&order_sn=',返回的页面让我和小伙伴都惊呆了。截图如下
这个页面告诉我们单引号被当作sql语句直接执行了,而且系统很豪爽的把sql的出错信息完整的告诉了大家,通过这个返回页面我们可以知道后台的表名称保留了ecshop的默认表。
系统执行的SQL语句为SELECT order_id, order_status, shipping_status, pay_status, shipping_time, shipping_id, invoice_no, user_id FROM `ecs_order_info` WHERE order_sn = ''' LIMIT 1 ),请注意我们输入的字符串会直接放入WHERE order_sn = ''的双引号内。熟悉SQL的同学们可以充分发挥你们的想象力了,提示下使用union(别小看这些平时不太起眼的词呀)。
这个漏洞相当于告诉大家,我给你们一个入口,可以执行sql语句,而且还可以把结果返回给你显示,太恐怖了,如果sql沟通得当,我们可以得到后台数据库中任何想要的信息。
既然这么多信息都能拿到,那什么最重要呢,其实我们只要拿到那个最重要的,其他的都很有更好的办法获得,聪明的朋友也许想到了,那就是获取管理员密码,你想想管理员密码都能拿到了,直接进入后台管理界面,通过正常的页面就能得到其他任何信息了。
那么怎么获得管理员密码信息呢?是不是觉得激动人心的时刻到了,事实上从发现漏洞,到漏洞发挥价值是一个煎熬也是令人激动的过程。
首先通过本地环境的数据库知道管理员信息存放在表ecs_admin_user表中,主要字段名user_name,password,那么获取用户名密码的简单sql为select username,password from ecs_admin_user;
考虑union的语法需要前后的字段数量、类型要一致才可,SELECT order_id, order_status, shipping_status, pay_status, shipping_time, shipping_id, invoice_no, user_id FROM `ecs_order_info` WHERE order_sn = '' LIMIT 1 ),我们可构造union select 1,2,3,4,5,6,concat(user_name,0x7c,password),8 fromecs_admin_user,其中0x7c为构造一个分隔符,便于区分用户名密码,那我们把整个sql连接起来在数据库中执行查询,看是否能得到想要的结果,至于在如何在数据库中执行查询验证我就不再这里赘述了,经过验证sql语句正确可以执行。
第二步,我们将这个sql放到url中,//localhost/user.php?act=order_query&order_sn='union select 1,2,3,4,5,6,concat(user_name,0x7c,password),8 fromecs_admin_user,看结果,是不是很失望,并没有返回我们想要的结果,通过查看错误提示,发现sql语法有错误,url中可以看到在union之前我们添加一个单引号,而网站在构造后台sql时会在order_sn的值两边都添加单引号,这样最后构造的sql是语法不正确的,怎么解决呢? 还得感谢sql提供的好东东 /* ,这个特殊语句用于注释后面的内容,我们把它加在我们构造的字符之后,就可以把不需要的内容屏蔽了,从而得到一个可执行的sql语句了。
第三步,再试//localhost/user.php?act=order_query&order_sn='union select 1,2,3,4,5,6,concat(user_name,0x7c,password),8 fromecs_admin_user/*,怎么样?是不是很激动呢!
第四步,激动之后定睛一看,不对呀,密码怎们是那么长一串字符呢,嘿嘿,我悄悄的告诉你,那是用md5做加密的,是不是有些灰心了,折腾了半天怎们拿到的密码还不能用呢,别灰心,要有耐心,要抱着水来土掩兵来将挡的精神,不折不挠,碰到拦路的要吗直接干掉要吗想办法绕过。至于md5密码如何使用网上有很多办法,本文中就不描述了,当然如果有必要的话,我会单独写文件介绍。
再给大家赠送一个附加信息,上述方法只会取数据库中的第一个管理员密码,如果想获取其他行的管理员密码,也有应办法,在sql后 增加limit语句 from ecs_admin_user limit 0,1/*,limit的语法大家可上网查找。
第五步,通过管理员账号密码登录后台,成功!!!后台数据都暴露与我的眼前!
第六步,既然都准备好了,就要真刀实枪的上阵了,访问朋友网站,开火,一切顺利,登录后台成功。告知朋友已经过测试,其网站存在漏洞。当我把管理员的密码告诉他时,他震惊了。
第七步,我们的目的不是攻击网站,是帮朋友提供解决办法提高网站安全性,不能忘记目的呀,要不就走上歪路了,呵呵。其实办法也很简单,如果会改代码的话增加sql校验即可。
当然朋友是小白,这种方法他肯定不会了,我就告诉他最笨的办法,其实ecshop已经公布了补丁,只是这哥们太懒没有升级,到ecshop下载补丁包升级网站程序,解决此问题。
以上sql注入语句不是本人原创,都是网上搜集到方法,我只是原封不动的利用或者略觉修改利用。
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入技术爱好者交流群373107565,我们一起学技术!