vlambda博客
学习文章列表

网络安全:sql注入(一)

    在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。


        一个严重的SQL注入漏洞,可能会直接导致一家公司破产!


       SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。


    比如我们最常见的登录,如果代码写的不严格很有可能存在严重的安全漏洞最终导致网站被攻陷


    

    如果是网站开发人员,也应该多了解了解sql注入,几天前我试了试了我自己还在开发中的网站,成功发现了漏洞(这波叫我攻击我自己网络安全:sql注入(一)


    事情是这样的,访问网站的个人中心是根据uid的不同然后导航到不同人的个人主页,uid是根据注册的先后顺序从一开始逐渐增长的。


网络安全:sql注入(一)


    后端是获取链接中的uid数字然后查询这个id下的所有文章并且展示在个人主页上。

    只要输入的uid数字数据库里查询不到就返回不存在该用户。

网络安全:sql注入(一)


    手动把uid的参数设置为非数字后才发现,网站直接报错,显示各种报错信息,和文件位置,这样的网站安全大大缺乏了保障。


    后端是这样写的

网络安全:sql注入(一)


    疏忽了uid为非数字的特殊情况,在发现问题后,才加上了红圈里面的代码。反思ing网络安全:sql注入(一):之前也了解sql注入,我以为我不会犯这种低级错误,其实网站有太多这种容易犯错的地方了,稍不留神就会留下漏洞,一定要多加小心。


数字型


网络安全:sql注入(一)


    在这种选项框,只让你选对应的数字,然后点击查询,发现了url并没有变化,说明了是post提交。用抓包工具抓到数据包获得参数。

为了方便演示,修改源码,使网站前端显示sql语句


网络安全:sql注入(一)

网络安全:sql注入(一)



    在id后面添加 or 1=1 #(不了解sql语句的小朋友这里where后面其实是查询的条件,1=1永远成立吧,所以就相当于不设置条件,#是为了注释掉源码中后面的代码 防止报错) 后发现所有内容全部爆出,说明存在注入


网络安全:sql注入(一)


    接下来的思路顺序就是:

获取数据库的名字根据数据库的名字查找mysql特殊的表,那个表里面存有所有表的名字找出有价值的表,获取表里面所有列的名字找出有价值的列,并获取对应的值


网络安全:sql注入(一)


上图是通过联合查询法查询数据库库名。

id=1 union select database (),2 &submit=%E6%9F%A5%E8%AF%A2



网络安全:sql注入(一)


上图是查看一下这个数据库里面存在哪些表


id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu' &submit=%E6%9F%A5%E8%AF%A2

网络安全:sql注入(一)

上图是通过查询pikachu这个数据库发现里面有users表,然后在查看users表里面存在哪些表项

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' &submit=%E6%9F%A5%E8%AF%A2


网络安全:sql注入(一)


    上图是通过查询users表发现表里存在2个表项分别是username和password,最后分别查看一下这两个表项的内容得到用户名和密码。


id=1 union select 1,username from users username &submit=%E6%9F%A5%E8%AF%A2




网络安全:sql注入(一)

    

    密码爆出了32位很有可能是md5加密随便找一个在线解密的网站,最后得到用户名:admin 的密码是123456


科普一下:md5加密是不可逆的,是无法通过加密后的密码获取明文的,并且加密是唯一的。至于为何还有这种在线解密的网站,它只是尝试了很多种情况然后存储起来,尽可能列举所有常见组合的加密结果,到时候如果密码设置的简单的话很容易就查到了。解密过程和爆破有点类似。


     上面这个例子是数字型注入,并且提交方式是post型的可以通过它的前端的选项判断,只能选择数字,然后点提交,说明它的后端接收的就是单纯的数字。

字符型


    让输入名字,并且查询说明了,这次后端接收的不单单是数字了,也有字符串,通常后端人员把输入的东西一股脑的变成字符串就不用区别对待是数字还是字符串了


网络安全:sql注入(一)


    输入1点查询 url发生改变说明是get请求


网络安全:sql注入(一)


同样修改源码使前端展现更方便我们演示


网络安全:sql注入(一)

    

    观察显示的sql语句我们这里比数字型多了个'的原因是为了使它和前一个'匹配否则就是where username='xxxxx' 所有的东西都写入到引号里了,注入的语句被当成了普通的字符串去查找。


    输入1' or 1=1#发现内容全部爆出,接下来就和数字型的套路一样了,先获取数据库的名字然后逐步获取有价值的东西


搜索型


网络安全:sql注入(一)

    

    根据描述,随便输入用户名中的一部分,输入n后发现,包含n的全部内容被显示出来,说明后端用的是模糊查询 :LIKE


网络安全:sql注入(一)


    查看网站源码说明我们的猜测没错,只是为了演示,正式操作时我们无需查看网站源码,因为我们很大概率搞不到网站源码


网络安全:sql注入(一)



    接下来操作和字符型一样,还是拼凑只不过这次多了个%接下来继续寻找有价值的东西


网络安全:sql注入(一)

网络安全:sql注入(一)


爆出了这样的错误


id=1 union select database (),user() &submit=%E6%9F%A5%E8%AF%A2

    报错信息提示我们列不一样,查看union的帮助文档后 发现联合查询的前后列数要相等,之前我们没报错的原因是,恰好都有两个,那么怎么确定要查询的字段数呢



网络安全:sql注入(一)




    使用语句order by 试探,发现order by 3正常 4 报错 说明共有三项 


接下来只需要将之前的

id=1 union select database (),user() &submit=%E6%9F%A5%E8%AF%A2

变成

id=1 union select 1,database (),user() &submit=%E6%9F%A5%E8%AF%A2


即可,然后按照套路,寻找有价值的东西就好。


最后

《刑法》第二百八十六条之一 【拒不履行信息网络安全管理义务罪】网络服务提供者不履行法律、行政法规规定的信息网络安全管理义务,经监管部门责令采取改正措施而拒不改正,有下列情形之一的,处三年以下有期徒刑、拘役或者管制,并处或者单处罚金:(一)致使违法信息大量传播的;(二)致使用户信息泄露,造成严重后果的;(三)致使刑事案件证据灭失,情节严重的;(四)有其他严重情节的。