网络空间安全实习日志day5

一.课堂笔记

1.sql注入类型

数值型:可以计算


2.工具:SQLmap

二.作业and实操

1.SQL知识总结

(1)SQL注入原理

SQL 注入就是指 Web 应用程序对用户输入的数据合法性没有过滤或者是判断,攻击者可以在Web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

(2)SQL注入常用函数及含义

version() # 查看数据库版本
database() # 查看当前数据库名
user() # 查看当前数据库用户
system_user() # 查看系统用户名
group_concat() # 把数据库中的某列数据或某几列数据合并为一个字符串
@@datadir # 查看数据库路径
@@version_compile_os # 查看操作系统

(3)SQL注入防御手段

使用参数化查询:使用参数化查询而不是拼接sql语句可以防止SQL注入攻击,并提高代码的可读性和可维护性。

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

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

最小权限原则:最小权限原则是一种安全性原则,指的是为了保护敏感数据和系统资源,用户应该被授予最小必需的权限。这意味着用户只能访问和执行他们工作所需的数据库对象和操作,而不是拥有对整个数据库的完全访问权限。使用最小权限原则可以减少潜在的安全风险和数据泄露的可能性。通过限制用户的权限,可以防止他们对数据库中的敏感数据进行未经授权的访问、修改或删除。

使用ORM框架:ORM(对象关系映射)框架是一种将对象模型和关系数据库之间进行映射的技术,它允许开发人员使用面向对象的方式操作数据库,而不需要编写繁琐的SQL语句。它们可以自动进行参数化查询,从而降低直接编写SQL语句的风险。

使用预编译语句:通过这种方式,可以确保SQL语句的结构在编译时就确定下来,之后传入的参数不会改变语句的结构,因此可以避免注入攻击。

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

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

使用Web应用防火墙:waf可以帮助识别和阻挡某些SQL注入攻击。

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

分块传输数据:攻击者可以将SQL注入代码分成多个部分,通过不同的请求发送,然后在服务器端重新组合执行。

HTTP参数污染:攻击者在同一请求中多次发送相同的参数名,但带有不同的值。由于WAF可能只检查第一个参数,后面的参数可能会被忽略,从而绕过过滤。

使用特殊字符:攻击者可以利用URL编码、HTML实体编码、JavaScript编码等方式来绕过WAF的字符过滤。

利用注释符:攻击者可以在SQL注入代码中使用注释符号(如–、/* */等),使得WAF无法正确解析整个SQL语句。

白名单绕过:如果WAF有白名单机制,攻击者可以尝试利用白名单中的信任IP或信任参数进行攻击。

时间盲注和错误回显:攻击者可以通过时间盲注(基于时间延迟的盲注)或错误回显(利用数据库错误信息)来获取信息,这些方法可能不会被WAF检测到。

文件上传漏洞利用:攻击者可以通过上传包含恶意代码的文件(如图片文件),然后通过文件包含漏洞执行恶意SQL代码。

请求头注入:攻击者可以在HTTP请求头中插入恶意代码,某些WAF可能不会检查请求头。

2.sqli-labs通关

(1)第一关

首先判断输入类型,由于输入参数没有进行计算所以判定为字符型


用order命令查列数,在输入4的时候报错了,所以判断一共3列

查显示位,发现第2,3列可以显示,于是我们后续攻击就应该在2,3列来进行

查询数据库名

查询表名

查询uers表里面的数据列的名字,找到username和password

最后成功查询到用户名和密码

(2)第二关

首先判断输入类型,由于输入参数进行了计算,所以判定为数值型


因为没有其他限制所以按照第一题的步骤一步步查询,最后得到用户名和密码

(3)第三关

首先判断输入类型,由于输入参数没有进行计算所以判定为字符型


在使用order by查列数的时候发现没有攻击成功,显示的是用户1的用户名和密码


推测可能是因为没有闭合,导致后面的命令没有起效,所以用’构造了闭合,成功查询到这个表格有3列

构造闭合后一步步查表名,列名

最后成功找到用户名和密码

(4)第四关

第四关同样是没有闭合的原因,通过测试发现它的闭合方式是用到”

构造闭合后成功查询

然后进行查询


最后找到用户名和密码

(5)第五关

输入?Id=1发现查询不到有效内容,猜测需要进行盲注

使用order命令还是可以正常查询到列数

获得名称方法1:使用盲注首先要判断数据库名称长度,猜测库名还是为security也就是长度为8,注入进行测试,发现长度确实是8


截取库名进行验证确定库名为security


方法2:直接用函数通过报错注入获得表名,列名



确定了库名,表名,列名后通过报错注入获得用户名和密码

3.SQLi的手工注入步骤

(1)确定注入点:一般在搜索框或者查询框等可以输入的地方,输入命令看能不能得到信息或者线索
(2)判断输入类型:通过命令判断输入是数值型还是参数型
(3)确定字段数量:用order by得到sql表的列数
(4)union联合查询:获得字段后通过union联合查询来获得更多数据库信息,如哪些数据会显示,sql版本号,数据库表名等
(5)攻击:最后根据获得的信息来用查询语句等针对目标进行攻击
(6)盲注:如果不能得到显示有效信息就使用盲注的方法攻击

4.sqlmap通过第六关

使用-u命令对目标网址进行注入,-D指定数据库,-T指定表,-C指定具体数据



得到目标数据库里的目标数据用户名和密码

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值