zoukankan      html  css  js  c++  java
  • 前端过滤,搜索框注入案例

    题目要求

    题目源于一个比赛,要求找出数据库中的flag字段的值。
    给的题目环境是一个新闻搜索引擎。


    界面

    界面

    开始渗透

    哈集美马修~

    1.sql注入检测,试探该网站有没有sql注入漏洞。

    首先猜测sql执行语句为:
    select [字段1,字段2...字段n] from [表名] where [内容字段] like '%关键词%' [...]
    中括号[]标识的都是未知内容。
    所谓检测就是在where后面的条件上做文章,改变其逻辑,让其恒为真。

    尝试在关键词中写1' or '1'='1'#(其中#为mysql的单行注释符,旨在去掉sql语句后面的逻辑,不同的数据库实现可能有些许不同)
    试图将sql语句改变为:
    select [字段] from [表名] where [内容字段] like '%1' or '1'='1'#%' [...]
    #符号后面的语句被注释掉了,并且where条件因为被加上 or '1'='1'所以恒为真。
    所以该sql等价于:select 字段 from 表

    此时点击搜索按钮,只要有内容被查出,说明该网站是有sql注入漏洞的。

    2.越过页面js脚本。

    然而,在我点击了搜索按钮之后,得到的只是一个警告框。


    警告框

    不急,这虽然证明该网站做了针对sql注入的防备,但不能说明防备是有效的。
    反而对于我来说这是一件可庆幸的事,说明该网站很有可能采用的是拼接sql的方式,为了防止sql注入而做了敏感字符过滤。

    现在找到弹框的js代码才是最重要的。
    右键页面,打开网页源代码。喜从中来。


    网页中的js脚本

    搜索按钮

    逻辑似乎已经看出来了,点击搜索后,获取关键词内容,对关键词内容进行敏感字符过滤。

    这个过滤是在前端进行的,所以形同虚设。虽然这个是一开始就加载了的代码,修改它不会起作用,但是可以采用地址栏执行js的方式,对这个函数进行重写。
    清空地址栏,输入javascript:前缀,给一个空格之后就可以写要执行的js代码了,直接定义一个名称为myFunction的函数,这个函数什么都不做,回车。


    重写js函数

    然后再次进行sql注入探测。


    搜索结果

    果了个然的查出了新闻记录。
    证明此网站确是存在sql注入漏洞的。

    3.探测select字段个数

    我的目的很明确,找到数据库中的flag字段,这个字段可能是在这个新闻表里面,也可能在别的表里面。这些之后慢慢爆。
    现在有个问题,怎样才知道想要的信息,也就是说,怎样才能让它把我想要的信息打印在页面上。
    通过firebug知晓了,点击搜索后并不是发送的异步请求,所以页面上的输出是在后端就已经搞定了的。

    神器一:union关键字
    union关键字,这个关键字可以将两个查询结果以一个结果集返回。这简直是神器。不过需要知道他的select语句里面查询了多少个字段,因为union连接的两个查询结果列数必需相等。

    神器二:order by关键字
    这就要用到另一个神器 order by。因为order by后面可以接数字,表示结果按select的第几个字段进行排序。

    猜测一下,因为页面上显示的每个新闻信息有3个字段,所以很有可能,select语句所查询的就是这3个字段。不过为了严谨,还是用order by来验证一下。

    关键词输入框输入:1' or '1'='1' order by 3#
    等价sql语句:select [字段] from [表名] order by 3


    查询结果


    有数据,说明字段数>=3

    关键词输入框输入:1' or '1'='1' order by 4#
    等价sql语句:select [字段] from [表名] order by 4


    查询结果


    无数据,此时后台sql一定是报错了,说明字段数<4
    综上,3<=字段数<4,得出字段数=3。

    4.在页面上输出自己想要输出的内容。

    用order by知道了字段数,就可以动用union神器了。
    用union时除了知道字段数,还需要知道字段类型,但是这个很简单,观察列表列出的值就大概清楚。

    关键词输入框输入:1' and 1=2 union select 20,'JerryL','hahaha'#
    等价sql语句:select 20,'JerryL','hahaha'(由于where恒为假,所以前面的查询一定没有结果,结果只可能是后面的查询)


    查询结果

    结果没问题。

    5.找表,找字段

    现在已经能够自由的操作页面的显示了,只需要找到flag所在的表,就可以完成任务。

    列出当前数据库所有表
    其实mysql把所有的表、视图、函数等信息都放到了information_schema这个数据库中,而所有表的信息在information_schema.TABLES这个表中。这就表示,只要知道了数据库类型是mysql,就可以用这个表来查询所有数据库,所有表的信息。

    还需要用到一个函数database(),这个函数返回当前web程序使用的数据库的名称。
    于是..

    关键词输入框输入:1' and 1=2 union select 20,'JerryL',TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database()#
    等价sql语句:select 20,'JerryL',TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database()


    当前数据库所有表

    可以看到这个数据库里面有两张表,一张admin,一张news。不过我们需要的是表名和字段名,所以只有表名是不够的。

    列出指定表中所有字段名
    有困难,找information_schema。
    在information_schema库里面的COLUMNS表中,有所有的字段信息。
    关键词输入框输入:1' and 1=2 union select 20,TABLE_NAME,COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA=database()#
    等价sql语句:select 20,TABLE_NAME,COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA=database()#


    查询结果

    真相大白。

    6.执行最后任务,拿出flag

    关键词输入框输入:1' and 1=2 union select 20,username,flag from admin#
    等价sql语句:select 20,username,flag from admin


    得到flag

    技巧总结

    1.sql注入探测,尝试通过参数修改sql where语句的逻辑,使其恒为真,执行后看逻辑是否被修改成功,从而判定是否有注入点。

    2.页面上的js几乎都是形同虚设的,总有办法让其失效,常用的就是浏览器地址栏输入:javascript: js代码。用js代码的执行来为一些变量赋值,或者重写函数。

    3.用order by探测字段个数,知道个数后,用union输出自己想要的内容。

    4.各大数据库实现都提供了许多可用的函数和元数据表等,这些都是很有用的工具。

    关于sql预编译

    个人理解,sql预编译不能完全解决sql注入的问题,他的作用仅仅是将敏感字符的处理从后端代码交给了数据库软件。
    也就是说,如果使用的数据库软件本身的实现是有漏洞的,那么照样可以进行sql注入。不过主流的数据库软件应该都是可靠的,所以程序中尽量采用sql预编译。



    作者:JerryL_
    链接:http://www.jianshu.com/p/d6199ed057eb
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/blacksunny/p/7739581.html
Copyright © 2011-2022 走看看