前言
上一篇我们有介绍到typecho的对于xss的过滤疏忽,该疏忽适配typecho的任意版本,包括最新的1.2,所以这里介绍如何提高typecho的安全,防止xss攻击,加强后台校验逻辑,防止其他手段突破拿到cookie入侵后台。
1. 放入xss.js文件至后台
xss.js是一个可以过滤xss代码的js代码
本文打包下载地址:
https://wwm.lanzout.com/izN6Y0foi3vc
密码:879i
将下载下来的js文件放到后台js文件夹里
默认typecho后台路径是:网站根目录/admin/js/
2. 后台评论js集合引用js文件
在你的后台目录里找到common-js.php文件
并在里面加入以下代码引用xss.js文件
<script src="<?php $options->adminStaticUrl('js', 'xss.js'); ?>"></script>
3. 在后台评论处修改过滤xss
在你的后台目录里找到manage-comments.php文件
并找到大约在:324行左右
将原先的“$('textarea[name=text]', edit).val(comment.text).focus();”
改成“$('textarea[name=text]', edit).val(filterXSS(comment.text)).focus();”
其中就是将comment.text用filterXSS方法包裹,其实filterXSS就是xss.js里面过滤xss代码的关键函数方法,可以直接调用
3.1 评论输出进一步加强xss防御
其实typecho后台评论显示中官方是有过滤xss的,用的php自带的htmlspecialchars函数,但是默认并不会过滤单引号的转义(可以被绕过),这里我们可以用php自带的strip_tags方法进一步去除html的标签过滤xss代码
大约在manage-comments.php文件的144行左右
<?php
//原先的官方输出的方法
//$comments->content();
//下面的htmlspecialchars函数也可以过滤
//并且配置了第二个参数ENT_QUOTES可以过滤单引号
//但是会把所有html js代码全部实体化没有换行效果
//该方法过滤xss是无敌的,加了第二个默认参数后
//xss不可能在绕过直接显示攻击到目标
//echo htmlspecialchars($comments->content,ENT_QUOTES,'UTF-8');
//这里的strip_tags可以支持白名单,我们可以将换行和p标签粗体过白让其可以正常输出
echo strip_tags($comments->content,"<br> <p> <b>");
?>
此致后台防御xss代码完成
4. 后台登陆加入session
找到路径:网站根目录/var/Widget/Login.php
在里面开启session并且拿到当前登陆的ip放到session里面去,关键修改方法和代码如下
php获取用户ip方法:
function get_user_ip()
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$cip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$cip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$cip = $_SERVER['REMOTE_ADDR'];
}
if ($cip == '::1') { // 使用localhost时
$cip = '127.0.0.1';
}
if (! preg_match('/^[0-9\.]+$/', $cip)) { // 非标准的IP
$cip = '0.0.0.0';
}
return htmlspecialchars($cip);
}
开始session后的关键代码:
session_start();
$_SESSION['LoginIP']=$this->get_user_ip();
5. 在后台加入判断过滤非法登陆
打开文件:网站根目录/后台目录/header.php
官方默认路径:网站根目录/admin/header.php
获取当前访问用户ip的代码上面有,下面是关键判断代码:
session_start();
$dqIp = get_user_ip();
if(isset($_SESSION['LoginIP'])){
if(strcmp($_SESSION['LoginIP'], $dqIp) != 0){
header('HTTP/1.1 301 Moved Permanently');//发出301头部
$urlTmp = "https://blog.wm404.com/";
header("Location: $urlTmp");
exit;
}
}
其实原理很简单,就是在访问后台的时候再次进行一次ip校验,如果登陆的ip和正在访问的ip不一致,那么可以判断出不是同一个人登陆的,所以直接拦截跳转首页,不允许进入后台,这里可以发挥大家的想象,可以是自己生成的指定token,什么都行,关键是如何判断是不是同一个的操作,会php代码的可以自己研究,不懂的略过。其中https://blog.wm404.com/改成你自己的博客主页,或者要跳转的url地址。
6. 操作函数也要加上ip判断
session_start();
$dqIp = get_user_ip();
if(isset($_SESSION['LoginIP'])){
if(strcmp($_SESSION['LoginIP'], $dqIp) != 0){
header('HTTP/1.1 301 Moved Permanently');//发出301头部
$urlTmp = "https://blog.wm404.com/";
header("Location: $urlTmp");
exit;
}
}
最后
至此,后台防御xss和非法登陆人校验完成,在很大程度上,防止了typecho后台被入侵,这里建议没有修改后台默认路径的小伙伴们请及时修改typecho后台默认路径。
补充内容1
typecho开启httpOnly防止xss
在网站根目录下的config.inc.php加入一行代码
ini_set('session.cookie_httponly', 1);
有问题的联系QQ1845440070
攻防无绝对,技术无黑白
感谢您阅读本文