【问题标题】:How to add domain in front of file_get_contents in PHP code如何在 PHP 代码中的 file_get_contents 前面添加域
【发布时间】:2014-09-24 04:07:54
【问题描述】:

我是新来的,有一个 PHP 编码器,可以对我的 2 个文件进行一些 mods p>

这是已编辑的代码(您可以使用“DrTech76”查看已编辑的部分)-:

get_image.php

<?php
require_once 'include/db.php';
$file_name = $_GET['f'];
if ( empty( $file_name ) || !file_exists( 'uploads/' . $file_name ))
{
    die( 'File not found...' );
}

$sql = "SELECT original_file_name FROM nfo_images WHERE file_name = '" . $file_name . "'";
$rs = mysql_query( $sql );
$file = mysql_fetch_assoc( $rs );

$original_file_name = explode( '.', $file['original_file_name'] );
//just get rid of the last, then put back together
array_pop( $original_file_name );
$original_file_name = implode( '.', $original_file_name );

header("Content-Type: image/png");
//start edit 10.07.2014 DrTech76, flow the direct image link through here to keep the actuall location unknown
if(!isset($_REQUEST["dl"]))
{//it's not a request through a direct link, so process as file download, as it was   originally
    header("Content-Disposition: attachment; filename=\"" . $original_file_name . ".png\"");
}
//end edit 10.07.2014 DrTech76, flow the direct image link through here to keep the actuall location unknown
echo file_get_contents( 'uploads/' . $file_name );
?>

另一个编辑的文件是 index.php(添加的输入区域,应该是文本区域 IMO,带有“选择复制”以将内容复制到剪贴板)(这只是我添加的已编辑区域,否则会太长)

<div id="uploaded_image_div" align="center">
            <b>Left Click on the Below Image to Save it to your PC...</b><br /><br />
            <div id="title" style="font-weight:bold;"></div>
            <br />
            <a href="" target="_blank"><img border="0" src="" /></a>
            <br />
            <?php
            //start edit 10.07.2014 DrTech76, direct link containers, styling is done  through css/style.css
            ?>
            <div id="direct_link">
                <label for="link">Direct link to this image</label><br />
                <input id="link" readonly onfocus="$(this).select()" />
            </div>
            <?php
            //end edit 10.07.2014 DrTech76, direct link containers, styling is done through css/style.css
            ?>


            <br />
            <br />

有人可以帮我解决这个错误吗,正如您从 NFOPic.com 索引页面中看到的那样,实际的域名没有显示 - 虽然我需要它,所以如果我将它上传到另一个域(一个新的测试版发布时选择的域)它将适用于任何域,而不仅仅是将 http://nfopic.com/ 放在代码前面 - 提前致谢!

【问题讨论】:

  • 你想在你生成的pdf上添加你的网站
  • 您应该在使用mysql_real_escape_string() 函数在SQL 中使用之前转义任何用户输入。我不知道您代码的其他部分,但例如,如果攻击者将创建像 ?f=';DROP TABLE nfo_images;-- 这样的查询,您将丢失所有数据。还有另外一个漏洞,如果攻击者传递像 ?f=../index.php 这样的参数,他将能够下载你的 php 脚本
  • 我可以确认您的网站存在漏洞。我能够获得您的数据库密码,登录“nf....ay”,密码“at...ew”...
  • "你试过这个网站吗?"不需要。此处发布的问题应该是诊断和解决问题所需的全部内容。
  • 问题是,我们 (Stackoverflow) 不是来为您的应用程序编写代码的。我会给你一些想法:首先你可以检查$file_name 变量的.. 等,它允许“攻击者”移动到父文件夹。您可以通过用str_replace 等替换它来修复它,这样给定的路径../index.php 就不会以uploads/../index.php 结尾,而是看起来像uploads/./index.php 或类似的东西。刚刚用谷歌搜索并找到了这个stackoverflow.com/a/8159368/724292 如果你没有任何子文件夹(在上传中),你应该检查一下,这应该很容易

标签: php html mysql css


【解决方案1】:

所以,这个脚本有很多事情要做。

1)摆脱XSS和SQL注入漏洞:

现在,您正在检查文件是否存在,这并非完全错误,但不能为您完成这项工作:

$file_name = $_GET['f'];
if ( empty( $file_name ) || !file_exists( 'uploads/' . $file_name ))
{
  die( 'File not found...' );
}

既然彼得已经告诉过你,你允许人们通过在浏览器中插入http://nfopic.com/get_image.php?f=../include/db.php 来下载你的 SQL Server 访问数据,我假设你理解了基本问题。 file_exists 只是检查文件在服务器上是否可用,这对于您的 include/db.php 文件是正确的。因此解释器跳过 IF 并继续执行。由于您已经在使用数据库,我们将使用它来确定文件是否真的存在。我们将在几秒钟内完成。

mysql_query 根本不安全(SQL 注入)!您必须使用 PDO 或 MySQLi 进行 SQL 查询(我使用 PDO 进行演示):

$prep = $db->prepare("SELECT original_file_name FROM nfo_images WHERE file_name = ?");
$prep->execute(array($file_name));
$res = $prep->fetchAll();
if(count($res) == 0){
  die( 'File not found...' );
}
$original_file_name = explode('.', $res[0]["original_file_name"]);
// ... and what else you want to do with the file name

您可以在此处阅读更多信息:http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

现在我们应该已经通过这种方式关闭了这两个漏洞(假设上传不允许与数据库进行错误交互->您需要检查generate_image.php)。

2) 您在添加域时遇到的问题:

我不太明白你的问题是什么,所以如果我没有正确回答,请随时发表评论并提出更多问题。

-您可以通过调用$_SERVER['SERVER_NAME'] 获取当前域。这应该输出类似:nfopic.com(不过我不知道你想在哪里添加)。

- 如果您的意思是input 字段中的域名错误,您可以在js/nfo.js 文件中更改它。有一行:

$('#uploaded_image_div #link').val('http://nfopic.com/get_image.php?f=' + validate[1]);

http://nfopic.com/get_image.php?f= 部分是硬编码的,因此您必须以任何其他方式插入它。

- 如果您打算将域名添加到用户可以下载的图像名称中,您必须使用.htaccess 文件重定向您的图像,以便您可以请求真实图像姓名image_234234.png

3) 主页的其余部分:

由于网站这部分有很多漏洞和错误,generate_image.php中肯定有一些。文件类型(txt、nfo 和 diz)的检查在 JS 中完成。问题在于,如果 PHP 中也没有一些检查,您可以解决它们并上传任何其他文件类型。这导致我们发现另一个漏洞 -> 可以上传一个 SHELL 脚本(简单的 PHP 文件),并且您的文件可能会被攻击者修改。

终于: 整个主页可能不安全。肯定有一些修改需要做。 再说一次,如果我没有回答您的开始问题,请随时提出更多问题。

【讨论】:

  • b4 我得到了您给出的完整详细答案(非常感谢和赞赏顺便说一句)& 有人用通俗的语言对我说 2 来改变是一种解脱(Thx 4 that 2):- ) 不涉及一些代码来替换其他代码或示例的解决方案/答案,例如你已经完成的,请越过我的头脑 & 正如你所看到的那样,ppl 告诉我我有一个问题,但不知道如何解决它。好的,说更改了相同的 db 文件及其位置并编辑了所有要求 db 文件 2 新名称/位置的文件,这会修复访问数据库文件的漏洞选项吗?如果不是,为什么不呢? &我会怎么做? THX
  • 每个 php 脚本都有一个 config 或 db 文件,所以如果不知道下落和名称是否可以解决这个问题? &我将如何修复它,以便没有人可以访问 db 文件? - 我认为现在最好一一解决您提出的每个问题,如果可以的话?再次感谢您抽出宝贵时间。哦,你谈到的 TXT、NFO、DiZ 文件漏洞,它的 PHP,但是如果你尝试上传不在“允许”文件列表中的任何内容,它会有一些代码,它会给出错误。我将在接下来上传该代码,看看您是否认为它足够安全,或者我可以添加一些内容以使其更好。
  • 对于您答案的 2) 部分,不,这不是我的意思。有一段时间,在某个浏览器上,域没有显示在 PNG 链接的输入字段中,它以 get_image.php 开头?等等没有它前面的域(4不管是什么原因,我不确定因为代码在之前或之后没有改变,现在它在所有主要浏览器上都可以正常工作)但我担心某些专门的浏览器会产生这种效果将来(它是 EpicBrowser 一个隐私浏览器或 GreenBrowser)我的观点是,我可以在前面添加一个代码来代表它托管的域可以解决这个问题吗?
  • 不客气 =) 好吧,您可以将 db 文件位置更改为未知文件夹(include 是一个很常见的名称)。但是您仍然可以下载get_image.php 文件,并在那里查看文件的路径-> nfopic.com/get_image.php?f=../get_image.php(将其重命名为something.txt,您应该会看到代码)。您确实应该使用数据库查询(如我在回答中所述)或仅链接到文件夹本身中的文件(链接到 nfopic.com/uploads/myfile.png)来执行此操作。下班后我会回答其他问题。
  • 如果你给我看你的上传文件,我可以看看。对于您最初的问题:没有合理的解释,即在没有预先设置域的情况下会显示链接。 http://nfopic.com/get_image.php?f= 是硬编码的,这意味着任何浏览器要么全部显示,要么不显示。如果你能确认我,你提到的浏览器现在正在这样做,我也可以看看,但我严重怀疑 -> 因为它根本没有意义。我希望我在上一条评论中回答了为什么“隐藏 db 文件”不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多