SQL注入中二阶注入原理

  • 1.sql注入原理?
    网站数据过滤不严格,过分信赖用户输入的数据,没有过滤用户输入的恶意数据,无条件的把用户输入的数据当作SQL语句执行,导致SQL注入漏洞产生。
  • 1.sql注入中二阶注入原理?

    二阶注入是用户输入被存储后(如数据库或文件),再次被读取并输入到sql查询语句中,从而导致注入攻击。
    1.插入恶意数据,进行数据库插入数据时,对特殊字符进行了转义处理,在写入数据库时保留了原来的数据。
    2.引用恶意数据,开发者默认存入数据库的数据都是安全的,进行查询时,之间从数据库中读取恶意数据,没有校验
    对输入进行了预处理或参数化查询,不直接将恶意代码插入到用户输入的地方,而是将恶意代码插入到数据库其他位置。
    第一进行数据库插入数据的时候,仅仅只是使用了addslashes或者是借助get_magic_quotes_gpc对其中的特俗字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据。将数据存入到数据库之后,开发者就认为数据是可信的。在下一次进行需要进行查询时,直接从数据库中取出脏数据,没有进行进一步的检验和处理,造成SQL二次注入。
  • SQL注入绕过
    1、注释符过滤绕过:-- # //
    2、大小写、双写绕过
    3、内联注释绕过
    4、编码绕过:引号如果被过滤可以使用16进制绕过、ascii编码、
    5、空格过滤绕过:可以替代空格的有/
    / 、()、`、tap
    6、符合进行过滤:and=&&、or=||、xor=|、not=!
    7、过滤等号(=)绕过:like、rlike模糊匹配
    8、过滤大于号小于号:greatest(n1、n2、n3...)返回n中做大值;least(n1、n2、n3...)返回最小值
    9、过滤引号绕过:编码、宽字节注入
    10、过滤逗号绕过:from for、
  • SQL注入防御
    1、预编译SQL语句
    2、检查数据类型,限制输入长度。
    3、设置黑名单
    4、使用参数化查询
    5、对用户输入进行严格过滤和转义
    6、为数据库分配最小的权限,限制其对数据库的操作;限制写文件(into outfile)等高危操作
    7、使用web应用防火墙、云端防护等
    8、定期安全审计、更新数据库配置
    9、自定义错误页面,关闭应用的错误提示。
    10、添加WAF
  • 预编译如何实现SQL注入防御
    预编译时防止语法结构被改变,先编译,再传值,用户传递的参数无法改变SQL语法结构。
    预编译:用占位符替代参数值,预先建立语法树。最初目的是提高代码的复用性。一次编译,多次运行。
    SQL预编译将SQL语句模板化,用占位符代替值(参数化绑定)并存储在数据库中,以便需要时再传入值执行,省掉了重复语法树的时间,实现快速执行。

  • SQL注入中过滤单引号及双引号如何进行绕过
    1、十六进制编码或者字符编码来代替字符串。(适用于支持十六进制字符串的数据库如mysql)

    2、宽字节注入:数据库使用GBK等字符集时,通过添加%df字符,使转义的反斜杠被合并,吃掉转义符,让单引号逃逸。

    3、等价函数替换:利用数据库内置函数或特性生成字符。CHAR()函数将ASCII码转换为字符,CONCAT函数拼接字符。 CHAR(97) = a

    4、数字型注入:参数本身为数字型,直接注入数字逻辑表达式。
    5、注释符绕过:注释掉后面查询,避免闭合引号的问题

    6、二次注入。如果应用在存储数据时过滤了引号,但在其他地方使用时未过滤,可能存储带有恶意代码的数据,后续使用时触发注入

    7、动态执行语句:SQL Server中使用EXEC或EXECUTE,PostgreSQL中使用EXECUTE,可能允许执行动态构造的字符串。

  • SQL注入中HTTP头注入
    能够对请求头信息进行修改,修改的请求头信息能够带入数据库进行查询,数据库没有对输入的信息进行过滤
    1、User-Agent:浏览器的身份标识字符串,如用户使用的操作系统,浏览器版本等。
    2、Cookie:一种小型文本文件,由网站存储在用户的本地终端(个人计算机上)
    3、Referer:表示浏览器访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面,告诉服务器该页面是从那个页面链接过来的,服务器因此可以获得一些信息用于处理
    4、X-Forwarded-For:Http请求端真实IP
  • 如何检测是否存在SQL注入
    1、手动检测输入点探测:
    识别所有用户输入点,如URL参数、表单字段、HTTP头、Cookie等。
    注入特殊字符单引号或SQL语法片段,观察返回结果是否异常。错误页面返回数据错误,则存在漏洞。
    2、自动化扫描工具:SQLmap
    3、响应行为分析:事件盲注,响应延迟;布尔盲注,触发页面差异。
    4、绕过waf测试:等号过滤使用like、rlike、between替换等号。注释符分割。
  • java中MyBatis框架里,#与$在SQL注入中区别

和$是用于SQL映射文件中引用参数的两种占位符。

{}是安全的,数据和指令分开,使用预编译能够有效防止SQL注入。传递值

${}是危险的,用字符串拼接,容易引发SQL注入漏洞。动态传递表名、列名等SQL关键字。

posted @ 2024-12-04 17:37  予遂计划  阅读(214)  评论(0)    收藏  举报