输入输出

输入输出即用户通过我们设置的搜索框对我们设置的数据库进行模糊查询,但是如果设置不当或者未做好过滤处理,就容易造成sql注入和XSS攻击

搜索框代码

<br><br><hr>
<form id="form1" action="" method="post">
<label for="search">内容搜索:</label>
<input type="search" name="search" id="search">
<input type="submit" name="submit" id="submit" value="提交">
</form>

后端进行模糊查询php代码

<?php
include('config/conn.php');//引入数据库配置文件
$s=$_POST['search'];
$sql="select * from sy_guestbook where gName like '%$s%'";//%是通配符的意思,中间只要有这个字符就可以,即实现模糊查询
$result=mysql_query($sql,$conn);
echo '你搜索的'."'$s'".'结果如下:';
while($row=mysql_fetch_array($result)){
echo '<br><br><hr>';
echo $row['id'].'<br>';
echo $row['gName'].'<br>';
echo $row['gLogo'].'<br>';
}

演示结果如下图所示

image-20240524083640013

XSS漏洞

恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击,其中XSS分为存储型、反射型、DOM型XSS

img

其中,这两个的主要区别是一个永久存在于目标服务器中,另一个需要欺骗用户进行点击链接才能触发XSS代码,多用于盗取用户的Cookie信息

在这里,我们属于反射型XSS,当我们输入<script>alert(1)</script>的时候,页面中会弹出1,当我们插入恶意js代码时,也会帮我们执行而造成安全问题,我们常用这种方式盗取管理员Cookie

image-20240524084710142

相关CTF考点:BUGKU 留言板_bugku留言板-CSDN博客

可以参考一下这一题,对于XSS漏洞的利用体现的淋漓尽致

留言板

和输入输出有一个共同点:输入的数据会在页面中显示,这也是造成XSS的第一个根本条件

留言的实现需要满足以下几个条件:

  • 加载之前的留言内容(从数据库加载)
  • 提交留言
  • 提交之后再次加载

有没有发现,如果我们将留言内容换成恶意js代码,就造成了存储型XSS

我们先来看看前端代码

留言:
<form id="form1" name="form1" method="post">
<p>
<label for="textfield">ID:</label>
<input type="text" name="id" id="textfield">
</p>
<p>
<label for="textfield2">昵称:</label>
<input type="text" name="name" id="textfield2">
</p>
<p>
<label for="textfield3">QQ:</label>
<input type="text" name="qq" id="textfield3">
</p>
<p>
<label for="textarea">内容:</label>
<textarea name="content" id="content"></textarea>
</p>
<p>
<input type="submit" name="submit" id="submit" value="提交">
</p>
</form>
<p>

<hr>
<p>留言内容:</p>
<hr>
<p>&nbsp; </p>

后端显示留言内容

$i=@$_POST['id'];
$n=@$_POST['name'];
$q=@$_POST['qq'];
$c=@$_POST['content'];
echo $i.$n.$q.$c;

查看数据库原始语句

include('config/conn.php');

if(!empty($i)){
$sql="INSERT INTO `test001` VALUES ('$i', '$n', '$q', '$c');";
mysql_query($sql,$conn);
}

对留言内容进行显示

$sql1='select * from sy_message';
$result=mysql_query($sql1,$conn);
while($row=mysql_fetch_array($result)){
echo '<br>';
echo 'ID:'.$row['id'].'<br>';
echo '昵称:'.$row['name'].'<br>';
echo 'QQ:'.$row['qq'].'<br>';
echo '内容:'.$row['message'].'<br>';
}

原理同上,可以参考那个CTF的考题,在此不多赘述

PHP全局变量

全局变量可以显示IP地址,归属地,浏览器信息,访问设备等($_SERVER专门负责接受这些信息),即我们可以通过UA头的信息进行获取相关的信息

可以参考如下文档:PHP: $_SERVER - Manual

通过UA判断设备

$referer=$_SERVER['HTTP_REFERER'];
$UA=$_SERVER['HTTP_USER_AGENT'];

echo $referer."<br>";
echo $UA."<br>";

image-20240524091305101

获取相关IP地址

function getIp()
{
if ($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"], "unknown")) {
$ip = $_SERVER["HTTP_CLIENT_IP"];
} else {
if ($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")) {
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
if ($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")) {
$ip = $_SERVER["REMOTE_ADDR"];
} else {
if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'],
"unknown")
) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = "unknown";
}
}
}
}
return ($ip);
}
echo getIp()."<br>";

通过执行代码,我们可以输出相关的IP地址

image-20240524091504620

实例-站长之家

站长之家通过我们与其数据交换过程中的数据包的UA头获取我们的IP地址及其他详细信息,如下图所示

77b70f3c8a24f1c992d5af70b20d8b4b

此时我们可以通过BP进行抓包,修改UA头部信息,进而使得站长之家返回我们修改的内容,此时就可以插入恶意JS代码,但是这个案例已经被修复了,过滤了<script></script>

CSRF(跨站点请求伪造)

CSRF,是恶意站点或程序通过已认证用户的浏览器在受信任站点上执行非正常操作。可进行的恶意操作局限于已在网站通过身份验证的用户的功能

CSRF示例

你的银行(bank.com)使用 GET 请求处理转账,其中包括几个参数(收款人身份以及转账的金额)
例如,如果 Jim 想给他的朋友 Bob 10 美元,请求可能如下所示:
http://bank.com/transfer?recipient=Bob&amount=10
现在,攻击者可能成功使 Jim 单击如下所示的链接(但已被巧妙的用缩短器或超链接缩短):
http://bank.com/transfer?recipient=Hacker&amount=100000
因为 Jim 已经登录,他的浏览器会将他的 cookie 和请求一并发送 — 所以他的银行相信他本人正在请求转账于是执行了转账请求