WP Admin AJAX安全-使用POST包含相对URL

时间:2018-11-28 作者:Christian Žagarskas

我已经设置了几个WordPress管理AJAX脚本(仅在管理面板中运行),目前它们都使用单独的操作、函数和nonce。

这些脚本之间唯一“真正”的区别是它们的PHP函数。因此,为了简化系统,我编写了1个JS函数和1个主要PHP函数来处理它们。

将发送一个$\\u POST值,并带有指向include的路径。因此,当wp_ajax_custom_func() 运行包含并包装在中的PHP文件locate_template()

It works great, but I am concerned if this creates a security hole?

我知道攻击者可以尝试伪造nonce,向admin-ajax.php, XSS/交叉脚本攻击等。。。

我这样假设是因为我已经将include包装在locate_template() 这将有助于保护系统。(当然,长边是SSL、wp\\u verify\\u nonce和current\\u user\\u can)

这是简化的核心概念。

安装程序

 wp_enqueue_script( \'ajax_js_class\', 
         get_template_directory_uri() . \'/theme/ajax_js_class.js\' 
     );

 wp_localize_script( \'ajax_js_class\', \'custom_settings\', array(
        \'my_ajaxurl\'    => admin_url( \'admin-ajax.php\' )
         // nonce and action are attached at the form level
    ) );
功能

  add_action( \'wp_ajax_run_ajax_class_func\', \'run_ajax_class_func\' ); 
  // wp_ajax_nopriv_run_ajax_class_func is not used

function run_ajax_class_func() {
    if(isset($_POST[\'nonce\'])) {
        $nonce=  $_POST[\'nonce\']; // the nonce from the form
        $action = $_POST[\'action_hash\']."-special-string"; // changes on each form
        $verify_nonce = wp_verify_nonce($nonce, $action); 

        if( $verify_nonce !== false ) {
            if(isset($_POST[\'path\']) && current_user_can(\'administrator\') ) {
                $path = $_POST[\'path\']; // <= this is my concern...
                include locate_template($_POST[\'path\']);
            } else {
            $output = json_encode( array( "success" => "false", "message" => "fail") );
            }
        } else {
        $output = json_encode( array( "success" => "false", "message" => "fail") );
        }
    } else {
      $output = json_encode( array( "success" => "false", "message" => "fail") );
    }

    echo $output; // this is handled in the include above
    // always die
    die();
}
HTML软件包

 <?php $nonce = wp_create_nonce( $random_hash."-special-string" ); ?>
 <form>
    <input type="hidden" name="path" value="in/theme/run_this.php" >
    <input type="hidden" name="nonce" value="<?php echo $nonce; ?>" >
    <input type="hidden" name="action_hash" value="<?php echo $random_hash; ?>" >
本地化Js Essentials

 $.post(custom_settings.my_ajaxurl, data, function(response) {
我曾试图攻击表单(使用Fiddler2修改标题和帖子数据),但怀疑我存在确认偏差。

我想咨询社区,看看这个想法是好是坏。(坏主意当然值得批评)

Questions:

  1. If I have secured the wp_ajax function (according to WordPress best practices) is it OK to use POST data to include a file within the WP Admin AJAX action?
  2. Am I making it easier for attackers to abuse the system?
  3. Is this creating an unnecessary back door in the system just to avoid writing several additional functions, ie: is it lazy?

    参考和研究:

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

如果正确使用nonce,则无法使站点处理假请求。。。所以这部分应该是安全的,但是。。。您的方法中仍然存在一个安全缺陷。。。

如果我可以让您在浏览器中运行我的JS脚本,而您以管理员身份登录,该怎么办?这是可能的。

这样,nonce不会导致验证错误,您的代码将执行我想要的任何内容-因为您不验证来自用户的输入。。。

所以你所有的安全性都是基于向你的站点注入一些JS的可能性——这很常见——只要看看WP中的恶意软件历史就可以了。。。

如果模板是基于已验证的数据加载的,则会更加安全。所以,不要直接加载它,而是列出正确、安全的模板列表,并根据POST中发送的变量加载它们。

回到你的3个问题:

1。如果我已经保护了wp\\u ajax功能(根据WordPress最佳实践),那么可以使用POST数据在wp Admin ajax操作中包含文件吗

否。根据用户发送的路径加载任何文件都是不可能的。如果您传递一个变量,然后将该变量转换为PHP中文件的路径,则会更加安全。

2。我是否使攻击者更容易滥用系统

您并没有让它变得更简单,但是是的-有可能攻击此类代码。

3。这是不是在系统中创建了一个不必要的后门,只是为了避免编写几个额外的函数,例如:它是懒惰的

是的。但您不必编写多个函数。您只需妥善保护这一点,并记住-您永远不应该信任来自用户的任何东西。

结束

相关推荐

无法使用AJAX访问数据库中的数据

我正试图在wordpress中首次调用AJAX。我遵循了一些教程,到目前为止已经达到了这一点。但当我试图安慰的时候。将从数据库中获取的数据记录在AJAX调用中,我发现以下错误:未捕获引用错误:未定义数据代码:功能。phpfunction my_ajax_handler(){ global $wpdb; $name = $wpdb->get_results(\"SELECT * FROM username\"); echo $name;