
zed0
扫盲-脚本sql注入基础原理(二)
>>
完整版
本帖最后由 zed0 于 2014-8-18 13:38 编辑
然后是第二个问题:怎么查询其他表中的信息。这个问题的答案是:根据不同数据库的不同语法来构造语句,使之能够被数据库执行。我个人对php+mysql比较熟悉,下面给出例子。网站原样是这样的:第一步,我们需要知道存放管理员账号密码的表叫做什么名字。最基础的一条语句是这样写的:www.xxx.com/product_show.php?id=9 and exists(select * from XXX)这后面的XXX就是你猜的表名。如果页面返回显示不正常,那就说明你猜错了。我来演示一下。这里我猜的表名是shit,就返回了一个不正常的页面,注意url里的20%是空格的意思。这个涉及到url编码,当你在url栏里输入空格的时候,就会被自动转换成20%。对,没错,是靠猜的。都说入侵需要一定的运气,这里就是运气的体现。在这里,我的运气就很好,其实我第一次猜admin就对了。给新手解释一下,在参数后面加的and exists(select * from admin)这句是数据库中的查询语句。这个页面最后给mysql的语句可能是这样的 SELECT * FROM product(产品表,具体叫什么不知道) WHERE id=9 AND EXISTS(SELECT * FROM admin)这里需要新手知道两点,第一:每个数据库都有他自己的内置函数比如这里的exists(),功能就是判断是否存在;第二:数据库操作语句是十分灵活的,只要你的权限足够你几乎可以通过构造语句来查询这整个数据库下面的所有数据。比如说,有个叫做旁注的术语,大概说的就是,在同一个服务器上面绑定多个网站的情况下,多有网站其实都使用同一个数据库实例。如果权限足够,我们可以利用这台服务器上面其他网站的漏洞来查出目标网站的数据。当然,在现在云服务器面前,旁注已经没有用了。然后,关于数据库操作语句本身,我想新手需要学学数据库才能够很好的理解了。这里不理解没关系,因为网上有很多针对不同数据库的注入语句,你可以直接拿来用。所以下面的步骤,我也不再解释语句的意思了。哦,对了,关于猜这个动作,其实现在也已经淡化了。应为随着数据库技术的发展,新版本的数据库系统功能已经非常强大了,这个强大在入侵方便的体现就是我们可以构造语句直接把数据库名、表名或者列名显示出来。想要深入了解的朋友,可以去网上搜一搜,很多的。不过我们现在使用的大部分注入工具,由于已经很久没有跟新了,所以可能还是使用的早前的方法,就是猜,来进行注入的。这里我运气很好,我按照以前的套路成功爆出了用户名和密码:我输入and exists(select name from admin),猜放用户名的字段名,返回正常页面;我输入and exists(select password from admin),猜放密码的字段名,返回正常页面;我输入 order by 13返回正常页面,说明产品表中有13个字段;然后,我通过联合查询的方式爆出了管理员的用户名和密码:之后把md5加密的密码放到专门的网站上面破解出来,接着找到后台的地址,就可以登陆到后台了。以上就是整个注入过程中的原理。不过,我找的这些网站都是完完全全的裸站,也就是说这样的网站其实已经很少了。如果以后有机会,我会把一些防御措施和技术细节的原理单独拿来介绍。