[BT]小迪安全2023学习笔记(第14天:PHP开发-输入输出)

第14天

名词解释

XSS(跨站脚本攻击,Cross-Site Scripting) 是一种常见的网络安全漏洞。它允许攻击者在用户浏览器中注入恶意脚本代码。这种攻击发生时,攻击者通常利用了网站或应用程序对用户输入的数据进行不充分的验证或清理。有时候人们会更倾向于将其称作 JavaScript 注入客户端代码注入

XSS 攻击的主要类型包括:

存储型 XSS(Persistent XSS): 恶意脚本被存储在目标服务器上,如数据库、消息论坛、访客留言板等。当其他用户访问存储了恶意脚本的页面时,脚本会被执行。

反射型 XSS(Reflected XSS): 恶意脚本来自于用户的请求。通常是通过发送含有恶意脚本的链接给用户,当用户点击链接时,请求被发送到服务器,然后服务器将脚本作为页面的一部分返回给用户的浏览器。

基于 DOM 的 XSS(DOM-based XSS): 完全在客户端进行,恶意脚本是在页面的 DOM 环境中执行的,而非来自服务器的响应。

XSS 攻击可能导致以下后果:

  1. 盗取用户的 cookie 或 session 信息。
  2. 改变网页内容或重定向到恶意网站。
  3. 进行钓鱼攻击。
  4. 利用用户的身份执行操作。
  5. 为了预防 XSS 攻击,可以采取以下措施:

基于XSS跨站脚本攻击的介绍,其实这个攻击可以运用在各种输入输出的地方(比如文本框),只要能显示用户输入的数据,原理上来讲都可以利用XSS,基于此有以下几种常见的利用方式。

搜索框搜索

代码展示:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $searchQuery = $_POST['searchQuery'];

    if (!empty($searchQuery)) {
        // 防止 SQL 注入
        $searchQuery = $conn->real_escape_string($searchQuery);

        $sql = "SELECT content FROM article WHERE content LIKE '%$searchQuery%'";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            echo "
"; echo "

搜索结果(共 " . $result->num_rows . " 条):

"
; while ($row = $result->fetch_assoc()) { echo "
"; echo "

" . $row["content"] . "

"
; echo "
"
; } echo "
"
; } else { echo "

没有找到相关内容。

"
; } } else { echo "

请输入搜索内容。

"
; } }

漏洞原理

源码根据用户搜索的文本内容直接构造sql语句$sql = "SELECT content FROM article WHERE content LIKE '%$searchQuery%'";,其中%$searchQuery%中的百分号代表通配符,前后内容不限,这行代码会把searchQuery变量的内容直接插进sql查询语句中(如果网站不对变量内容进行检测或者处理那么可能造成SQL注入漏洞)

还有一些网站会把用户搜索的内容原封不动显示在网页上,比如显示(查询“XXX”的结果如下),对于浏览器来说如果XXX是纯文本,它会直接显示,但如果是js代码那么它会执行(前提是网站原封不动的显示XXX)

网页展示

[BT]小迪安全2023学习笔记(第14天:PHP开发-输入输出)_第1张图片

留言板

代码展示:

if (empty($name) || empty($title) || empty($content)) {
        echo "

提交失败:请填写所有文本框的内容

"
; } else { $sql = "INSERT INTO user_message_board (name, title, content) VALUES ('$name', '$title', '$content')"; if ($conn->query($sql) === TRUE) { echo "

留言成功!

"
; } else { echo "

错误: " . $conn->error . "

"
; } }

漏洞原理

根据表单的name、title和content写入对应数据表的值,由于是留言板,所以最后也会向用户展示留言内容,而攻击者就可以利用name、title或content中的其中一个进行XSS攻击(也可以三者同时利用)。

和搜索框不一样的是留言板属于存储型 XSS,会被插入数据表保留在服务器里,而搜索框属于反射型XSS,只有当用户操作时才会显示内容。

网页显示

[BT]小迪安全2023学习笔记(第14天:PHP开发-输入输出)_第2张图片

名词解释

CSRF(跨站请求伪造,Cross-Site Request Forgery) 是一种网络攻击,它诱使受害者在当前已认证的Web应用上执行非预期的操作。这种攻击发生时,攻击者利用了用户已经登录的浏览器中的认证状态

如何工作:
假设您登录了某个银行网站,并在同一浏览器的另一个标签页中访问了恶意网站。这个恶意网站包含了一个向您的银行发送请求的表单(例如,转账请求)。如果银行网站没有妥善验证请求是否是用户有意发送的(分析链接来源),那么这个恶意表单提交就可能导致您的账户中的资金被转走。

CSRF的特点:
利用用户当前的登录状态:CSRF 攻击不需要窃取用户的用户名或密码,而是利用了用户已登录的事实。

对用户透明:受害者可能不会意识到攻击发生,因为他们在自己信任的网站上进行了操作。

涉及请求:攻击通常涉及到构造或伪造请求,例如表单提交。

PHP的$_SERVER超全局变量

_SERVER常用数组名介绍:点击这里
一般通过抓包工具修改对应值间接控制_SERVER

漏洞原理

在 PHP 中,$_SERVER 是一个包含有关服务器和执行环境信息的超全局变量。它通常用于获取如头信息、路径以及脚本位置等数据。然而,在 XSS(跨站脚本攻击)的上下文中,某些 $_SERVER 变量可能被滥用,如果不正确地处理用户输入或者不正确地渲染输出到 HTML。

$_SERVER 变量的潜在风险:

  1. 用户可以修改变量组里面的任意一个值来进行攻击(例如有的网站如果会显示用户访问的User-Agent,那么我们将User-Agent的值修改为攻击代码,网页)
  2. $_SERVER[‘PHP_SELF’]:它包含了当前执行脚本的名称。如果直接在表单的 action 属性中使用,攻击者可以通过修改 URL 来注入恶意代码。
  3. $_SERVER[‘HTTP_REFERER’] 或 $_SERVER[‘HTTP_USER_AGENT’]:这些字段包含了来自用户浏览器的数据,如果没有适当的处理,直接输出到页面中可能导致 XSS。
HTTP_REFERER

例如当你登录了一些支付网站后打开了其他的网站(攻击网站伪装的),此时攻击网站请求支付网站转移资金,由于浏览器保存了支付网站的账户和密码会自动登录,因此支付网站不会验证账号密码而直接进行要求的操作。为了避免这种情况,一般网站会查看 _SERVER[‘HTTP_REFERER’] ,验证来源网页是否合法(从哪个页面跳转过来的),如果不合法则不进行操作。有些留言板网页也有可能验证$_SERVER[‘HTTP_REFERER’],因为留言需要账户登录的状态,如果直接访问留言链接是没有进行登陆的,此时也不会开放留言给用户。因此,如果网站没有验证HTTP_REFERER,那么极有可能造成CSRF攻击。

HTTP_X_FORWARDED_FOR

例如有些后台管理网站只允许特定IP地址的主机登录连接,而网站的判断原则是利用_SERVER[‘HTTP_X_FORWARDED_FOR’]的话那么我们可以伪造对应值进行绕过,修改成网站接受的IP地址(一般为127.0.0.1),这种情况下很容易就能绕过,因为网站判断的是 HTTP_X_FORWARDED_FOR而这个值我们也能伪造。但有的网站可能验证的是TCP连接的IP地址,此时再修改 HTTP_X_FORWARDED_FOR就没有用了。

你可能感兴趣的:(小迪安全学习笔记,安全,学习,笔记)