青瓜博客-青瓜来学安全 - sql注入
type: channel
link: https://webxxe.cn/index.php/tag/sql%E6%B3%A8%E5%85%A5/
items: SQL注入备忘录(1)

SQL注入备忘录(1)
type: item
date: 2022-07-08T11:33:00+08:00
description: sqlSQL注入前言SQL注入(SQL Injection) 即是指web应用程序对用户输入数据的合法性没有判断或过滤不严，攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句，在管理员不知情的情况下实现非法操作，以此来实现欺骗数据库服务器执行非授权的任意查询，从而进一步得到相应的数据信息SQL注入是一种常见的Web安全漏洞,攻击者利用这个问题,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击SQL定义SQL是操作数据库数据的结构化查询语言，网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数，修改拼接成SQL语句，传递给Web服务器，进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库，就可能导致拼接的SQL被执行，获取对数据库的信息以及提权，发生SQL注入攻击特点1、广泛性2、隐蔽性3、危害大4、操作方便原理SQL注入攻击是通过操作输入来修改SQL语句，用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令，最终使web服务器执行恶意命令的过程。可以通过一个例子简单说明SQL注入攻击。假设某网站页面显示时URL为http://www.example.com?test=123，此时URL实际向服务器传递了值为123的变量test，这表明当前页面是对数据库进行动态查询的结果。由此，我们可以在URL中插入恶意的SQL语句并进行执行。另外，在网站开发过程中，开发人员使用动态字符串构造SQL语句，用来创建所需的应用，这种情况下SQL语句在程序的执行过程中被动态的构造使用，可以根据不同的条件产生不同的SQL语句，比如需要根据不同的要求来查询数据库中的字段。这样的开发过程其实为SQL注入攻击留下了很多的可乘之机。注入分类1、按照注入点的数据类型(数据库) 分类1). 数字型注入当输入的参数为整型时，如ID、年龄、页码等，如果存在注入漏洞，则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中，弱类型语言会自动推导变量类型，例如，参数id=8，PHP会自动推导变量id的数据类型为int类型，那么id=8 and 1=1，则会推导为string类型，这是弱类型语言的特性。而对于Java、C#这类强类型语言，如果试图把一个字符串转换为int类型，则会抛出异常，无法继续执行。所以，强类型的语言很少存在数字型注入漏洞。数字型注入的例子1. select * from user where id = 1 2. select * from user where id = (1) 3. select * from user where id = 1 and 1 = 12). 字符型注入当输入参数为字符串时，称为字符型。数字型与字符型注入最大的区别在于：数字型不需要单引号闭合，而字符串类型一般要使用单引号来闭合字符型注入的例子1. select * from user where id = '1'; 2. select * from user where id = "1"; 3. select * from user where id = ('1'); 4. select * from user where id = ("1"); 5. select * from user where id = (('1')); 6. select * from user where id = (("1")); 7. select * from user where id = '1 and 1 = 1'; 注意: 必须要考虑 引号闭合和注释问题2、注入点的位置分类1.GET 注入 2.POST 注入 3.COOKIE 注入 4.HTTP 头部注入3、其他分类1.搜索框 2.登陆框获取敏感数据顺序思路库名 -> 表名 -> 字段名 -> 字段内容注入过程第一步：SQL注入点探测 第二步：收集后台数据库信息 第三步：猜解用户名和密码 第四步：查找Web后台管理入口 第五步：入侵和破坏关于数据库的知识点SQL运算符优先级 and 和 or SQL中and(逻辑与运算) 的优先级要高于 or(逻辑或运算) select 1=2 and 1=2 or 1=1 true MySQL注释 # -- (减减空格) /* */ 判断注入点1. ?id=1 2. ?id=1' 3. ?id=1' and 1=1 4.?id=1' and 1=2 --+ ?id=-1' --+ 5. ?id=1' …