网络与系统攻防技术|实验八 Web安全
网络与系统攻防技术
实验八 Web安全
dky 20192414 袁浩然
实践目标
- Web前端HTML
- 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
 
- Web前端javascipt
- 理解JavaScript的基本功能,理解DOM。
- 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
- 尝试注入攻击:利用回显用户名注入HTML及JavaScript。
 
- Web后端
- MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
- 编写PHP网页,连接数据库,进行用户认证
 
- 最简单的SQL注入,XSS攻击测试
- 安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。
实验步骤
实验一 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
- 
在进行XSS和CSRF演示汇报时,使用了pikachu网站。在搭建pikachu时,使用了phpstudy_pro软件(国产化xampp),集成了Apache。 
 ![]() 
- 
编写一个表单输入用户名和密码的HTML 
 ![]() 
实验二 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
- 
代码如图 
 ![]() 
- 
代码解析如下 - form表单负责提交用户输入的用户名和密码。点击提交按钮,通过表单的onsubmit属性进入函数validateForm
- x和y分别读取表单的用户名和密码,通过规则进行判断。
- 如果用户名是空,则ID名为tips的结构输入HTML内容没有输入用户名,在网页中显示为按钮下面多出一行字,没有输入用户名
- 如果密码是空,则ID名为tips的结构输入HTML内容没有输入密码
- 如果用户名和密码都存在,则ID名为tips的结构输入HTML内容欢迎+输入的用户名
 
- 如果用户名是空,则ID名为tips的结构输入HTML内容
- 因为不与后端相通信,则必须return false,否则会引起页面跳转。
 
- form表单负责提交用户输入的用户名和密码。点击
- 
演示如下: - 
没有输入用户名 
 ![]() 
- 
没有输入密码 
 ![]() 
- 
输入用户名与密码 
 ![]() 
 
- 
实验三 尝试注入攻击:利用回显用户名注入HTML及JavaScript
- 
因为我们将HTML内容进行替换,则可以进行HTML和Javascript的注入攻击。 
- 
注入攻击代码演示如下 
- 
注入HMTL - 
用户名填写为 <h1>你好1</h1>
- 
将id名为tips里面的内容进行替换得 
 ![]() 
- 
则可以成功注入html代码 
 ![]() 
 
- 
- 
注入Javascript - 
用户名填写为 <script>alert(1);</script>
- 
按说会执行alert(1)进行弹窗,但是由于 return false,没有进行重新加载,则JavaScript不会执行,导致失败。
 ![]() 
- 
替换后的网页 
 ![]() 
 
- 
MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
- 
使用了phpstudy_pro软件,自带mysql数据库,安装过程略。 
- 
点击启动即可启动 
 ![]() 
- 
因为没有配置环境变量,进入mysql安装文件夹使用 mysql -u root -p并输入root密码进入mysql命令行
 ![]() 
- 
建立数据库 20192414_database
 ![]() 
- 
建立数据表 20192414_table
 ![]() 
- 
插入数据 
 ![]() 
- 
通过select语句我们可以看到成功插入 
 ![]() 
- 
创建用户&删除用户 
 ![]() 
- 
更改密码 
 ![]() 
编写PHP网页,连接数据库,进行用户认证
- 
对数据进行初始化 - 
设置服务IP地址,数据库用户名、密码和需要创建的数据库 
 ![]() 
- 
连接数据库并测试连接 
 ![]() 
- 
创建新的数据库 
 ![]() 
- 
连接新的数据库 
 ![]() 
- 
创建新的数据表 
 ![]() 
- 
填写数据 
 ![]() 
 
- 
- 
网页点击初始化进行初始化 
 ![]() 
- 
进行用户认证 - 创建新的页面hello_php.php
- 
将表单action属性设为 check.php,如果没有输入用户名或密码会阻止提交(return false)
 ![]() 
- 
如果成功提交,会跳转到页面check.php 
 
- 
- 创建新的页面check.php
- 
对表单提交的username和password进行存储 
 ![]() 
- 
连接数据库 
 ![]() 
- 
使用sql语句进行查找 
 ![]() 
- 
如果结果大于0行(找到符合的用户名和密码),显示登陆成功,如果没找到,显示用户名或密码错误 
 ![]() 
- 
完整代码如下 
 ![]() 
 
- 
 
- 创建新的页面hello_php.php
- 
输入正确的用户名和密码 - 
输入 
 ![]() 
- 
返回值 
 ![]() 
 
- 
- 
输入错误的用户名和密码 - 
输入 
 ![]() 
- 
返回值 
 ![]() 
 
- 
最简单的SQL注入,XSS攻击测试
- 
此php脚本为我自己书写,没有防止sql注入和XSS注入。 
- 
SQL注入 - 
用户名设置为 ' or 1 =1 #则可以成功注入
 ![]() 
 ![]() 
- 
将用户名设为 root,密码设为' or 1 =1 #(万能密码)则可以成功利用管理员身份登陆网站
 ![]() 
 ![]() 
 
- 
- 
html注入 - 同理,利用直接显示代码可以将用户名设为<h1>我是20192414</h1>,密码使用万能密码(' or 1 =1 #)成功注入HMTL代码
 ![]() 
 ![]() 
 
- 同理,利用直接显示代码可以将用户名设为
- 
JavaScript注入 - 同理,利用直接显示代码可以将用户名设为<script>alert(1);</script>,密码使用万能密码(' or 1 =1 #)成功注入JavaScript代码,成功弹窗。
 ![]() 
 ![]() 
 
- 同理,利用直接显示代码可以将用户名设为
安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。
- 本实验使用pikachu平台进行练习
SQL注入
数字型注入
- 
页面如下 
 ![]() 
- 
随便查询3,发现id=3 
 ![]() 
- 
如果查询语句为 where id = 3,则后面添加or 1 = 1,则where为永真式。
 ![]() 
- 
注入成功,查询到所有的信息 
 ![]() 
字符型注入
- 
页面如下 
 ![]() 
- 
搜索用户名为1,显示不存在 
 ![]() 
- 
如果查询语句为 where id = '$_POST["username"]',则输入' or 1 =1#,语句变为where id = '1' or 1 = 1,为永真式。
 ![]() 
- 
查询成功! 
 ![]() 
搜索型注入
- 
页面如下 
 ![]() 
- 
输入 ' or 1 =1#,注入成功
 ![]() 
xx型注入
- 
页面如下 
 ![]() 
- 
输入 ' or 1 =1#,注入失败
 ![]() 
- 
猜测查询语句为 where id = ('$_POST["username"]'),则注入') or 1 =1#,
 ![]() 
- 
成功! 
 ![]() 
XSS注入
反射型XSS(Get)
- 
页面如下 
 ![]() 
- 
随便注入11,发现is后面回显11 
 ![]() 
- 
尝试写入 <script>alert(1);</script>,发现写不完全
 ![]() 
- 
F12查看代码,发现只能输入20个字符 
 ![]() 
- 
将20更改为100,输入 <script>alert(1);</script>
 ![]() 
- 
弹窗,注入成功! 
 ![]() 
- 
另一种思路,注入111,用burp查看,message=111 
 ![]() 
- 
将111改为 <script>alert(1);</script>
 ![]() 
- 
注入成功! 
 ![]() 
反射性XSS(POST)
- 
页面如下,随便输入 
 ![]() 
- 
显示用户名或密码错误 
 ![]() 
- 
发现有提示用户名和密码,直接登陆 
 ![]() 
- 
随便注入1 
 ![]() 
- 
有1的回显 
 ![]() 
- 
注入 <script>alert(1);</script>
 ![]() 
- 
弹窗,成功! 
 ![]() 
CSRF攻击
- 上课时间已经演示过了,略
问题及解决方案
PHPstudy以及XAMPP MySQL无法正常启动
- 查看3306端口占用,如果占用,从配置文件中更改端口
- 如果还无法使用(比如说我),则需要卸载掉本机已经有的MYSQL数据库,这样可以正常使用
Javascript和PHP不熟练
- 虽然我有一定的基础,很久很久以前学过PHP和Javascirpt,但是已经忘得差不多了
- 重新自学,学会了很多语言,再学其他的语言不难了
PHP查询失败
- 使用"SELECT id, username, password FROM MyUser WHERE username = " . $get_username . " and password = " . $get_password;查询失败
- 发现用户名和密码需要用''括起来
- 改为"SELECT id, username, password FROM MyUser WHERE username = '" . $get_username . "' and password = '" . $get_password . "'";成功
感想
- 此次实验所有代码均为我自己进行书写
- 我从大一开始,为了搞创新竞赛,就从算法和网页两者毅然决然选择了学网页,到现在已经有两个多年头了,这两年学习了HTML CSS Javascript Vue pythonWeb JavaWeb PHP多种语言
- 大一大二的时候还对CTF进行了学习,主攻Crypto和Web,大二国赛SQL注入注了一整天都没有注进去,当场退役。
- 对本次实验,我认为比较轻松,把PHP和Javascript进行复习以后就可以做了。对比较简单的SQL注入、XSS和CSRF也有一定的了解。
- 本次实验期间,我们小组还进行了汇报,汇报的内容为XSS和CSRF。
- 通过汇报和实验,我巩固了我的Javascript和PHP,并且对XSS SQL注入 CSRF有了更深入的学习和体会。
 
                     
                    
                 
                    
                









































































 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号