zoukankan      html  css  js  c++  java
  • SQL注入

    一.http header 注入
    有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑,则可能会导致基于http header的SQL inject漏洞。
    1.首先打开pikachu,点开http header 点一下提示,登录

    2.打开burp suite,右击抓取到的get请求,发送到Repeater

    3.打开Repeater,把User-Agent的信息修改为单引号,右边的Response会报错,说明存在着一个SQL注入!

    4.将User-Agent后的'替换成构造的payload进行测试
    1' or updatexml(1, concat( 0x7e,version()) ,0) or '

    还有一种方法是cookie测试,获取到cookie后到数据库拼接进行相关的操作,也有可能会产生SQL注入漏洞的。
    首先要先把之前在User-Agent输入的payload删掉,然后在cookie的用户名admin后面加入单引号,运行后可以看到显示报错,接下来在cookie用户名中输入1' and updatexml(1, concat( 0x7e,version()) ,0)#,可以看到报错显示数据库版本信息。


    二.盲注
    在有些情况下,后台使用了错误信息屏蔽方法(比如@)屏蔽了报错,此时无法在根据报错信息来进行注入的判断,这种情况下的注入,称为"盲注"。根据表现形式的不同,盲注又分为based Boolean和based time两种类型。
    1.based on boolean
    基于真假的盲注主要特征
    没有报错信息
    不管是正确的输入,还是错误的输入,都只有两种情况(可以看做 0 or 1)
    在正确的输入下,后面跟 and 1=1 / and 1=2 进行判断

    kobe' and 1=2#

    只能通过 真 或者 假 来获取数据,所以手工盲注是很麻烦的。
    先在数据库shell中输入payload查询ASCII码或者长度的判断
    select ascii(substr(database(),1,1));
    select length(database());

    知道长度后,在pikachu靶场中输入payload,获取到了用户信息,判断数据库由哪些字母组成
    kobe' and ascii(substr(database(),1,1))>7#
    kobe' and ascii(substr(database(),1,1))=112#
    不断重复,然后取得数据库名。
    还有一种方法是更改database()函数来获取用户信息
    kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>7#
    2.based on time
    基于boolean的盲注在页面上还可以看到0 or 1的回显,而基于时间的注入就什么都看不到了,我们通过特定的输入,判断后台执行的时间,从而确定注入点,比如用 sleep() 函数
    在pikachu靶场中,打开web开发者找到web控制台,点开网络。输入kobe' and sleep(5)# 会看到页面暂停了5秒,说明了存在着一个基于time盲注的SQL注入。

    接下来我们先构造一个payload
    kobe' and if((substr(database(), 1, 1))='p', sleep(5), null)#
    这个payload 的含义是当前数据库如果第一个字母是p就5秒才会返回执行结果,否则立即返回。

    当然我们也可以像真假注入是一样的了,替换 database()

    三.宽字节注入
    在宽字节中,单引号会被转义为斜杠"",这样会无法构造一个SQL语句。可以通过在单引号前面加" %df ",来让单引号逃过转义。通过burp suite抓包,发送到Repeater,输入payload到name中.我们构造kobe%df' or 1=1#

    四.表(列)名的暴力破解
    之前我们通过 information_schema 去获取的信息,很多时候我们没有权限去读取里面内容,也可能是别的数据库,没有 information_schema
    常用的方法就是用暴力破解的方式去获得表名和列名
    提交这个kobe' and exists(select * from aa)# 会得到提示

    遍历我们字典中的表名,把拦截的数据包发到 BurpSuite 中的Intruder中暴力破解 表名即可

    表名不存在时,会提示 doesn't exist,我们匹配这句话


    这时候就爆破出一个表名了——users
    同理爆破列名的时候输入kobe' and exists(select aa from users)#
    五.SQL漏洞防范
    1.代码层面
    对输入进行严格的转义和过滤
    使用预处理和参数化(Parameterized)
    2.网路层面
    通过WAF启用防范SQL Inject注入策略(或类似防护系统)
    云端防护(360网站卫士,阿里云盾)
    六.sqlmap工具
    将解压好的sqlmap文件夹放到python文件夹下面。

  • 相关阅读:
    HookLogger的使用
    文件创建与读写练习
    存储流练习2
    闭包
    Console命令详解,让调试js代码变得更简单
    清除浮动的3种方法
    js继承的几种实现方法
    题一
    题二
    十个修复IE6下bug技巧
  • 原文地址:https://www.cnblogs.com/ruoxi/p/13511016.html
Copyright © 2011-2022 走看看