《11招玩转网络安全》之第四招:low级别的DVWA SQL注入

简介: PHP + MySQL、ASP + MSSQL、JSP + PostgreSQL各种组合层出不穷,最终LAMP占了绝对的上风。这种动态页面和数据库结合的方式好处在于可以快速地更换关键位置的参数,坏处则是有可能带来SQL注入漏洞。

以DVWA为例,进行手工注入,帮助读者了解注入原理和过程。

1、启动docker,并在终端中执行命令:

docker ps -a

docker start LocalDVWA

docker ps

执行结果如图4-19所示。
195

图4-19  启动DVWA

2、在浏览器地址栏输入127.0.0.1后回车,浏览器打开了DVWA页面(DVWA在前面的章节中已建立完毕)。先点击左侧栏的DVWA Security,将难度调整至Low级别。单击左侧栏的SQL Injection,进入SQL注入页面,如图4-20所示。
image196
图4-20  DVWA SQL注入

3、按照提示在文本框中填入用户ID(这里填入1),单击Submit按钮,执行结果如图4-21 所示。
image197
图4-21  DVWA返回数据

4、返回了两个字段First name和Sumame。先看一下服务器对用户提交的数据User ID是如何处理的。单击页面右下角的View Source按钮,如图4-22所示。
image198
图4-22  Low级别SQL注入代码

从图中可以看出服务器对用户输入的数据id未做任何处理,直接用于SQL语句了。手工注入首先要确定页面到底使用了数据库中多少个字段。再确定各个字段的位置。最后在字段的位置构建SQL语句,进行注入。
5、先确定使用的字段数目,在文本框中输入1’ order by 2#。此时服务器接受数据,$query= “SELECT first_name, last_name From Users WHERE user_id=’1’ order by 2# ”。后面的构建方法大致都是如此,相当于自行输入一个合法的SQL语句的后半截,加入到服务器的SQL语句中去。单击Submit按钮,得到结果如图4-23所示。
image199
图4-23  测试数据库字段1

6、能正常返回页面,说明至少引用了两个字段(因为该页面使用get方式提交数据,所以也可以在地址栏中构建SQL语句进行注入。但需要注意一下,将空格、分号转换成ascii代码格式)。继续在文本框中输入1’ order by 3#,单击Submit按钮,得到的结果如图4-24所示。
image200
图4-24  测试数据库字段2

7、不能返回正常页面,说明页面中应用的数据库字段不超过3。结合前面一次的测试。可以得出结论,该页面引用了数据库中的2个字段。下一步来查看数据库引用字段存放的位置。在文本框中输入1’ union select 1,2#。单击Submit按钮。得到的结果如图4-25所示。
image201
图4-25  测试字段位置

从上图中可以看出,first name后面显示的是第一个字段,Sumame后面显示的是第二个字段。现在可以自行构建SQL语句,进行SQL注入。目前有2个位置可以注入,任选一个都可以,这里选择的是第二个位置。在文本框中输入1’ union select 1,version()#,返回数据库版本,如图4-26所示。
image202
图4-26  返回数据库版本

8、在文本框个输入1’ union select database(),2#。这次选择第一个字段位置注入,返回了数据库名字,如图4-27所示。
image203
图4-27  返回数据库名字

9、已知数据库名字,可以通过查询MySQL的information_schema数据库中的tables表,得到DVWA数据库中的所有表。在文本框中输入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#,返回DVWA数据库中所有的表,如图4-28所示。
image204
图4-28  返回数据库中的表

10、上图中可以看出,DVWA中的表有guestbook和users,这里需要user表的内容。先获取users表中的字段。在文本框中输入1' union select 1,group_concat(column_name) from information_schema.columns where table_name='user'#,返回获取表users中的所有字段,如图4-29所示。
image205
图4-29  返回表字段

11、这里返回了很多字段,Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,Create_tablespace_priv,ssl_type,ssl_cipher,x509_issuer,x509_subject,max_questions,max_updates,max_connections,max_user_connections,plugin,authentication_string,password_expired,is_role,default_role,max_statement_time。但实际上DVWA数据库中的表users中并没有这么多的字段,多出的字段是MariaDB其他数据库中users中的字段。现在要做的是将DVWA数据库中表users的字段分离出来。在文本框中输入1' and exists(select host from users)#,测试user字段是否属于表users。返回结果如图4-30所示。
image206
图4-30  测试host字段

12、返回了错误信息,说明host字段并不是DVWA数据库表users中的字段。继续测试user字段,在文本框中输入1' and exists(select user from users)#,返回结果如图4-31所示。
image207
图4-31  测试user字段

13、能够正常返回,说明user字段是DVWA数据库表users中的字段。继续这个一个个的测试下去。最后得到了数据库DVWA中表users的所有字段,user_id,first_name,last_name,user,password,avatar,last_login,failed_login。

14、已知数据库DVWA中表users的所有字段。现在可以下载表中的数据了。在文本框中输入1' union select 1,group_concat(user_id, first_name, last_name, password, avatar, last_login, failed_login) from users#,返回的结果如图4-32所示。
image208
图4-32  获取表数据

如果需要处理其他的表,按照这个顺序重新处理一遍就可以了。

有兴趣的欢迎一起读这本书《11招玩转网络安全——用Python,更安全》
11

相关文章
|
26天前
|
SQL 安全 数据库
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
【7月更文挑战第26天】在 Python Web 开发中, 安全性至关重要。本文聚焦 SQL 注入、XSS 和 CSRF 这三大安全威胁,提供实战防御策略。SQL 注入可通过参数化查询和 ORM 框架来防范;XSS 则需 HTML 转义用户输入与实施 CSP;CSRF 防御依赖 CSRF 令牌和双重提交 Cookie。掌握这些技巧,能有效加固 Web 应用的安全防线。安全是持续的过程,需贯穿开发始终。
50 1
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
|
27天前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【7月更文挑战第25天】在Python Web开发中确保应用安全至关重要。以下是针对SQL注入、XSS与CSRF攻击的防护策略及示例代码
45 6
|
27天前
|
SQL 安全 数据库
|
24天前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
【7月更文挑战第27天】在 Web 开发中,Python 面临着如 SQL 注入、XSS 和 CSRF 等安全威胁。
47 0
|
26天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
35 1
|
26天前
|
SQL 安全 前端开发
Web安全新纪元:Python如何筑起SQL注入、XSS、CSRF的铜墙铁壁?
【7月更文挑战第26天】在Web开发中,安全性至关重要。Python提供强大工具来抵御SQL注入、XSS和CSRF等威胁。使用ORM如Django和SQLAlchemy可防SQL注入; Django等框架自动转义输出防XSS; CSRF通过自动及手动验证令牌来阻止。开发者须持续学习最新安全实践以保护用户数据。迈向Web安全新纪元,Python助你一臂之力。
28 1
|
24天前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
【7月更文挑战第27天】在 Python Web 开发中, 安全至关重要。
36 0
|
24天前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【7月更文挑战第27天】在 Web 开发中,安全漏洞如同暗礁,其中 SQL 注入、XSS 和 CSRF 尤为棘手。本文通过实战案例展示如何使用 Python 抵御这些威胁。
45 0
|
24天前
|
SQL 安全 数据库
守护Web世界的和平使者:Python Web安全基础,从认识SQL注入、XSS、CSRF开始!
【7月更文挑战第27天】在数字世界里,Web应用如星辰照亮信息交流,但也潜藏安全隐患:SQL注入、XSS与CSRF。SQL注入让攻击者操控数据库;通过参数化查询可防御。XSS允许执行恶意脚本;确保输出编码至关重要。CSRF诱骗用户发送恶意请求;使用CSRF令牌能有效防护。作为开发者,掌握Python Web安全基础,如Flask和Django的安全特性,能帮助我们守护这片数字天地的和平与繁荣。
27 0