• SQL注入基础


    目录

    什么是SQL注入?

    (1)SQL注入原理

    (2)注入的两个条件

    (3)MySQL中的注释

    (4)SQL注入的过程

    (5)SQL注入带来的危害

    (6)万能密码的原理

    (7)判断是否存在SQL注入

    SQL注入的类型

    (1)字符型

    (2)数字型

    (3)布尔盲注

    (4)时间盲注

    (5)报错注入

    (6)联合查询注入

    (7)堆查询注入

    SQL注入漏洞形成原因?

    (1)动态字符串构建引起

    (2)后台无过滤

    (3)错误处理不当

    (4)不安全的数据库配置


    什么是SQL注入

    ​        攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。

    ​         由于服务端不安全、不完整的过滤,导致不应该非法的数据被带入,比如单双引号等导致前面语句闭合,后面就可以随意写恶意语句。

    (1)SQL注入原理

           服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。

    (2)注入的两个条件

    •     用户能够控制输入
    •     原本程序要执行的SQL语句,拼接了用户输入的恶意数据

    (3)MySQL中的注释

    • - #号-->一般需要进行编码=%23
    • - -->
    • - /*  */

    (4)SQL注入的过程

    • 攻击者访问有SQL注入漏洞的网站,寻找注入点
    • 构造注入语句,将注入语句和程序中的SQL语句结合生成新的SQL语句
    • 提交生成的新SQL语句到服务器的数据库中
    • 数据库指向有注入语句的SQL语句,引发SQL注入攻击

    (5)SQL注入带来的危害

    • 绕过登录验证:使用万能密码登录网站后台等
    • 获取敏感数据:获取网站管理员帐号、密码等
    • 文件系统操作:列目录,读取、写入文件等
    • 注册表操作:读取、写入、删除注册表等
    • 执行系统命令:远程执行命令
    • 最重要的危害:数据丢失

    (6)万能密码的原理

    • 通过在用户名处传入参数'or 1=1 --进行万能密码登录
    • 实际查询语句:SELECT * FROM users WHERE username = **" or 1=1 --** AND password = 'anything';
    • 使用or连接两个条件,无论前一个条件对不对,只要保证后面的条件恒为真时,就能正常执行查询语句
    • 相当于:SELECT * FROM users ;

    (7)判断是否存在SQL注入

    • ?id=1 and 1=1(确保and前后条件都为真)

    • ?id=1 '(加单双引号)

    • 数据库函数(布尔盲注/时间盲注)sleep((3),0) 若为真则暂停3

    • length()函数判断

    SQL注入的类型

    (1)字符型

    传过来的数据使用单双引号包裹起来,所以需要进行单双引号闭合。

    案例sqli-labs第一关:在源码中可以看出id没有任何过滤,使用单引号闭合

    (2)数字型

    传过来的数据没有使用单双引号包裹,查询时就无需在id传输的数据上单双引号

    案例sqli-labs第二关:源码中可以看出传入的数据id没有使用单双引号包裹,且无任何过滤,我们使用updatexml进行报错注入输出root

    (3)布尔盲注

    true/false,传入的数据放入字符串中,不依赖时间,可以直接判断传入的数据真或假,传入数据为真时有显示,数据为假时不显示

    案例sqli-labs第八关:当数据为真时有输出显示

     当数据为假时没有显示

    (4)时间盲注

    只能依靠时间判断真假,真假显示一个结果

     案例sqli-labs第九关:当数据正确时暂停3秒,若数据不正确则不暂停

    (5)报错注入

    会将错误信息输出到屏幕上,对的不会显示数据,所以我们需要依靠mysql_error()函数报出我们需要的数据

    案例sqli-labs第五关:使用各种报错注入函数进行报错注入

    • ST_LatFromGeoHash()      (mysql>=5.7.x) 

    • ST_LongFromGeoHash       (mysql>=5.7.x)、使用方法与ST_LatFromGeoHash()相同(不加concat函数仅能识别系统的命令,不能使用select查询语句)

    • GTID       (MysQL >= 5.6.X-显错<=200)

    • floor (8.x>mysql>5.0)、全版本支持

    • ST_Pointfromgeohash((select语句),1)     (mysql>=5.7)  或:ST_Pointfromgeohash(系统参数,1)(两个参数都要写)

    • updatexml  :   接受三个参数(1,concat('~',(select查询语句),'~'),1)/   updatexml函数最多容纳32位,超过32位以后数据就无法显示。

    • extractvalue  :  extractvalue函数接收两个字符串参数,一个属xml标记片段和xpath表达式xpath expr ,第一个参数就是为了上传一个xml文档,第二个参数就是用xpath路径法查找路径,而extractvalue报错注入就是通过再函数中写如不符合语法格式的xpath达到报错的目的,并且通过拼接sql注入语句从而通过报错查询并显示我们想要查询的内容;

    (6)联合查询注入

    会报错、使用union一次查询多个select语句

    (7)堆查询注入

    同时执行多条语句的注入

    SQL注入漏洞形成原因?

    (1)动态字符串构建引起

    • ​         不正确的处理转义字符(宽字节注入)     
    • ​         不正确的处理错误(报错泄露信息)
    • ​         不正确的处理联合查询
    • ​         不正确的处理多次提交(二次注入)

    (2)后台无过滤

    • ​        后台没有过滤或编码用户数据
    • ​        数据库可以拼接用户传递的恶意代码

    (3)错误处理不当

    • ​        详细的错误消息返回给了用户
    • ​        错误信息会给攻击者提供下一步帮助

    (4)不安全的数据库配置

    • ​       在连接文件中使用root用户和密码
  • 相关阅读:
    【算法优选】 滑动窗口专题——贰
    Kettle连接Oracle(Oracle19c&Oracle11g)
    编写基于冒泡排序算法的qsort函数
    解决 net core 3.x 跨域问题
    【基于YOLOv8的森林烟雾火焰检测 附源码 数据集】
    LeetCode 2582. 递枕头
    C# TCP Server服务端多线程监听RFID读卡器客户端上传的读卡数据
    Revit中圆形连接件直径与半径的选择及管道快速连接问题
    Java复习-20-接口(3)- 代理设计模式
    Nodered系列—写入tDengine超级表,自动创建子表
  • 原文地址:https://blog.csdn.net/qq_52016943/article/details/126227738