2021-01-22

2 篇文章 0 订阅
1 篇文章 0 订阅
本文详细探讨了SQL注入的各种手法,包括利用'or'、'and'进行条件判断,通过'orderby'判断表结构,以及利用各种函数如hex(), ascii(), length(), substring()等进行数据操纵。讲解了如何防范报错注入和时间延迟盲注,提供了解决方案和实例。
摘要由CSDN通过智能技术生成

SQL注入

目录
SQL注入 1
一、 “or” “and” 2
二、 order by 2
三、 Where 3
四、 Union 4
五、 MySql注入常用函数 5
六、 MySql注入 – 基础 – 编码或变形hex() 7
七、 MySql注入 – 基础 – 编码或变形ascii() 8
八、 MySql注入 – 基础 – length()函数 9
九、 MySql注入 – 基础 – substring()函数和mid()函数 9
十、 MySql注入 – 字符串 – elt()函数 10
十一、 MySql注入 – 基础 – 字符串连接concat() 10
十二、 MySql注入 – 基础 – 字符串连接concat_ws() 10
十三、 MySql注入 – 基础 – group_concat() 11
十四、 MySql注入 – 报错注入 – rand() 11
十五、 MySql注入 – 报错注入 – extractvalue() 12
十六、 MySql注入 – 报错注入 – updatexml() 13
十七、 常用函数 – xml解析函数 – extractvalue 14
十八、 布尔型注入 14
十九、 时间延迟盲注 14

一、 “or” “and”

and:用于结合select中where子句,可用来判断注入点的是否存在引号和其值的类型(且)

or: 用于结合select中where子句,尝试全查询是or 1=1,的绝对条件(非)

二、 order by

  1. order by:SQL中用于排序,用法主要是:
    order by 字段 / order by 字段所在列数
    order by email = order by 4
    排序方式有:DESC降序 ASC升序(默认ASC)

当order by 后面接的字段的数字超过了表中最大字段数,就会出现错误(可以用来判断表中的字段数量)

三、 Where

  1. MySQL数据库中的条件子句,用于获取符合条件的记录
    WHERE 条件
    里面存在逻辑判定符:
    = :返回两个值是否相等,相等返回“true”

<> !=:两个都为不等于判断,不相等返回“true”

:大于,(A>B)返回

<:小于,(A<B)返回

=:大于或等于,(A>=B)

<=:小于或等于,(A<=B)

WHERE子句中还可以嵌套查询,子查询等等
四、 Union

  1. Union:连接查询语句,连接多个select查询语句显示在一个数据集中,但是条件为查询的字段数量和类型需要相互对应,第一张表的字段的字段名称为所有连接查询组合后的字段名称
    (a)默认模式
    select 语句。。。。。。
    union
    select 语句。。。。。。;

(b)ALL模式
select 语句。。。。。。
union all
select 语句。。。。。。;

五、 MySql注入常用函数
系统函数:

  1. MySQL版本:versionI()

  2. 数据库用户名:user()

  3. 数据库名:database()

  4. 数据库路径:@@datadir

  5. 操作系统:@@version_compile_os

数据库管理

  1. show database:查看所有的数据库名

  2. use_name:切换数据库

  3. show tables
    MySQL常用注入

    1. 爆库:select schema_name from information_schema.schemata;

    2.爆表:select table_name from information_schema.tables where table_schema=‘information’

3.爆列:select column_name from information_schema.columns where table_name=“user” and table_schema=‘information’;

六、 MySql注入 – 基础 – 编码或变形hex()

  1. 十进制数字转十六进制

  2. 字符串转十六进制

  3. 十六进制转字符串:select concat(0x系类十六进制)

七、 MySql注入 – 基础 – 编码或变形ascii()

  1. 字符串转ascii码select ascii(‘字符’);

  2. ascii转字符串select char(码值);

八、 MySql注入 – 基础 – length()函数

  1. length():获取字符串的长度

九、 MySql注入 – 基础 – substring()函数和mid()函数

  1. substring()/mid():获取选择字符串指定的内容

十、 MySql注入 – 字符串 – elt()函数

  1. elt():返回对应位置的字符串
  2. 语法
    ELT(N,str1,str2,……)
    如果N = 1,则返回str1; N = 2,则返回str2;以此类推

十一、 MySql注入 – 基础 – 字符串连接concat()

  1. concat():拼接函数,可以拼接字符串,也可以拼接字段

十二、 MySql注入 – 基础 – 字符串连接concat_ws()

  1. concat_ws():拼接函数,可以拼接字符串,也可以拼接字段,但是回指定参数之间的分隔符
    CONCAT_WS(separator,str1,str2,…)

十三、 MySql注入 – 基础 – group_concat()

  1. group_concat():返回一个字符串结果,该结果由分组中的值连接组合而成

十四、 MySql注入 – 报错注入 – rand()

  1. rand():产生并返回一个0-1之间的随机浮点数
  2. floor:取值小于数字(非正数)的最大整数,负数取仅小于它的负整数

组合使用,返回一个3-12之间的随机整数

十五、 MySql注入 – 报错注入 – extractvalue()

  1. extractvalue() :对XML文档进行查询的函数
    语法:extractvalue(目标xml文档,xml路径)
    第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容
    正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
    select username from user where id=1 and (extractvalue(‘anything’,’/x/xx’))

使用concat()拼接 ‘ / ‘ 效果相同

当我们使用错误的语句时
select username from user where id=1 and (extractvalue(‘anything’,concat(’~’,(select database()))))

以~开头的内容不是xml格式的语法,报错但是会出现库名
extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位
十六、 MySql注入 – 报错注入 – updatexml()

  1. updatexml():更新xml文档的函数
    语法updatexml(目标xml文档,xml路径,更新的内容)

当我们使用正常的语句时,不会报错
select username from user where id=1 and (updatexml(‘anything’,’/xx/xx’,‘anything’))

使用错误的语句出现报错,并出现信息
select username from user where id=1 and (updatexml(‘anything’,concat(’~’,(select database())),‘anything’))

十七、 常用函数 – xml解析函数 – extractvalue
同十六
十八、 布尔型注入

  1. 布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据
    可以尝试一下的函数
    Length()函数 返回字符串的长度
    Substr()截取字符串
    Ascii()返回字符的ascii码
    sleep(n):将程序挂起一段时间 n为n秒
    if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
    如length(database())>10判断数据库名的长度(1=)true 0=》false)

Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)2))a from information_schema.columns group by a;
count(
)计数 concat()连接字符 floor()重复数据,返回0,1两个值 group by 进行分组 rand(0)避免数据重复造成的错误

时间型:通过页面沉睡时间判断
通过 sleep()函数测试,通过if()和sleep()联合逐个猜解数据

十九、 时间延迟盲注

  1. 0x00 延迟注入定义
    i. 延迟注入,是一种盲注的手法, 提交对执行时间铭感的函数sql语句,通过执行时间的长短来判断是否执行成功,比如:正确的话会导致时间很长,错误的话会导致执行时间很短,这就是所谓的高级盲注.SQLMAP、穿山甲、胡萝卜等主流注入工具可能检测不出,只能手工检测,利用脚本程序跑出结果。
  2. 0x01 延迟注入的函数
    i. sleep() //延迟函数
    ii. if(condition,true,false) //条件语句
    iii. ascii() //转换成ascii码
    iv. substring(“string”,strart,length) //mid()也一样,取出字符串里的第几位开始,长度多少的字符
    v. If表达式:IF(expr1,expr2,expr3)
    vi. 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3
    vii. Mid函数:MID(column_name,start[,length])
    viii.
  3. 0x02 延迟注入实列
    i. 含有时间延迟注入代码
<?php header("Content-type:text/html;charset=utf8"); $link = mysql_connect("localhost", "root","root"); mysql_select_db("mysql", $link); mysql_set_charset("utf8"); $sql = "SELECT user FROM user where user='{$_GET['username']}'"; echo $sql; $query = mysql_query($sql); echo "this is a time blode "; ?>

ii. 手工检查延迟注入
?username=root’ and sleep(5)#
?username=root’ and sleep(5) and ‘xRsl’=‘xRsl#
?username=root’ and If(ascii(substr(database(),1,1))=114,1,sleep(5))#
如果以上存在注入,会出现延时的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值