前序文章
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs)
目录
- 示例网站搭建
- 1.搭建LAMP开发环境
- 1. MySQL
- 2. PHP
- 3. Apache
- 写在示例前
- 示例1.反射型HTML注入
- 页面效果
- 源码
- 示例2.钓鱼表单
- 页面效果
- 源码
- 示例3.存储型HTML注入
- 页面效果
- 源码
示例网站搭建
1.搭建LAMP开发环境
使用kali
快速搭建LAMP开发环境,自带,不需要大费周章安装。用whereis
命令查看是否有LAMP开发环境
1. MySQL
whereis mysql
-
启动mysql服务
若输入
mysql -u root -p
显示如下,说明服务未开启
输入sudo service mysql start
启动服务,再输入,显示可以登录。
另:从未使用mysql 需要按如下步骤完成初始安装:
3. Apache
whereis apache2
-
启动apache
判断apache是否启动,可以打开浏览器访问
localhost
,若显示下图,说明未启动。
输入命令sudo service apache2 start
启动apache服务。若显示下图,说明apache已经启动
写在示例前
apache的默认站点位置在/var/www/html
所以各位运行前需要将面的所有文件放置在该目录下,首先cd
到该目录,创建三个文件夹
- phishing_site
- reflection_html_injection
- store_html_injection
创建文件夹使用mkdir
命令
然后再将相应的示例文件粘贴到对应文件夹下。
(当然,你不创建文件夹也可以,只要你记得住对应的示例文件名即可)。
示例1.反射型HTML注入
页面效果
涉及文件
reflection_html_injection/index.php
浏览器中输入网址:localhost/reflection_site/index.php
页面效果:
在输入框输入
<script>alert("哎哟,你干嘛");</script>
点击搜索显示如下:
这就是最基本的反射型html注入,但是,这种html并不会持久存在,而是伴随着每次注入在网页显示。
源码
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>搜索页面</title></head><body><form action=" " method="GET"><label for="searchBox">搜索:</label><input type="text" id="searchBox" name="q"><input type="submit" value="搜索"></form><?phpif(null !== ($query = $_GET['q'] ?? null)){ echo "Your search result for:$query";}?></body>
</html>
示例2.钓鱼表单
页面效果
涉及文件:
- phishing_site/index.php
- phishing_site/reward.php
模拟在官方网站填写表单点击提交按钮后,通过HTML注入攻击向该网页注入钓鱼链接,跳转至第三方网页进行用户信息窃取.
浏览器中输入网址:localhost/phishing_site/index.php
跳转后进入第三方网站(这里为了演示方便直接俄访问了同服务器的文件)
源码
phishing_site/index.php
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>搜索页面</title></head><body><form action=" " method="GET"><label for="searchBox">搜索:</label><input type="text" id="searchBox" name="q"><input type="submit" value="搜索"></form> <h2>搜索结果:</h2>
<?php
//php8.1不能直接使用isset函数进行判断if(null !== ($query = $_GET['q'] ?? null)){ echo "<p>",$query,"你好,点击我查看你的大奖</p>" ;echo "<a href="."reward.php".">查看大奖</a>";}?></body>
</html>
phishing_site/reward.php
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>中奖信息填写</title></head><body><h1>恭喜你中奖啦!xx大学优秀毕业生!请填写下面的表单以便于我们联系你</h1><form action=" " method="GET"><label>联系信息</label><label for="username">姓名</label><input type="text" id="username" name="uname"><label for="phoneNumber">电话</label><input type="text" id="phoneNumber" name="phone"><label for="IDCard">身份证号</label><input type="text" id="IDCard" name="id"><input type="submit" value="提交"></form></body>
</html>
示例3.存储型HTML注入
页面效果
涉及文件
store_html_injection/index.php
store_html_injection/post.php
这种是持久性存在的,应为将注入的内容上传到了服务器端,影响了数据库。
index.php页面上方展示了两个填写表单,点击post后会将两个数据存入mysql数据库。
分割线下面是为了便于演示,选择查询数据库的所有信息展示在页面上。
浏览器中输入网址:localhost/store_html_injection/index.php
现在开始html注入,在content 或者title中输入:
并提交数据库
刷新页面后就会出现,并且换用户登录依然会这样显示,也就是说这种影响是持久的。破坏了网站的正常功能。
源码
store_html_injection/index.php
<!DOCTYPE html>
<html>
<head><title>My Blog</title>
</head>
<body><h1>Welcome to my blog</h1><form method="POST" action="post.php"><label for="title">Title:</label><input type="text" name="title" id="title"><br><label for="content">Content:</label><textarea name="content" id="content"></textarea><br><input type="submit" value="Post"></form>
<hr><?php
// 数据库连接信息
$servername = "localhost:3306";
$username = "root";
$password = "991109";
$dbname = "ctf";// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);// 检查连接是否成功
if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);
}// 查询comment表中的数据
$sql = "SELECT id, title,comment FROM comments";
$result = $conn->query($sql);// 如果有数据,输出到HTML页面
if ($result->num_rows > 0) {while($row = $result->fetch_assoc()) {echo "<p>ID: ".$row["id"]."<br>Title:".$row["title"]."<br>Comment: ".$row["comment"] . "<br><hr></p>";}
} else {echo "0 结果";
}// 关闭连接
$conn->close();
?></body>
</html>
store_html_injection/post.php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {$title ="'".$_POST["title"]."'";$content = "'".$_POST["content"]."'";$current_time = (int) time();
//连接数据库
try {$conn = mysqli_connect('localhost:3306','root','pasd','ctf');if (!$conn) {throw new mysqli_sql_exception(mysqli_connect_error());}
}//try
catch (mysqli_sql_exception $e) {echo 'MySQL connection error: ' . $e->getMessage();
}//catch//如果连接成功了
if($conn){$sql = "INSERT INTO comments(id,title,comment) VALUES ($current_time,$title,$content)";if (mysqli_query($conn, $sql)) {echo "Data inserted successfully";} else {echo "Error: " . $sql . "<br>" . mysqli_error($conn);}echo "Post successfully submitted!";//关闭数据库连接mysqli_close($conn);
}//if($conn)
}
?>