V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qzhsjz
V2EX  ›  程序员

自己手撸了一个网络验证和示例程序,求给点安全方面的指导

  •  
  •   qzhsjz ·
    qzhsjz · 2021-03-07 10:44:30 +08:00 · 3653 次点击
    这是一个创建于 1364 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网站用的是 Django 。

    http://198.55.123.196/

    主要目的是限制软件的用户必须在登录的状态下运行被保护的功能,所以只要能够绕过登录运行被保护的功能就证明这个系统依然有漏洞。

    客户端是 C++写的,界面库是轮子哥的 GacLib 。

    第 1 条附言  ·  2021-03-08 11:29:22 +08:00

    感谢这位老铁给我刷的人气,好家伙,刷了400围观马甲 刷人气

    话说Django有没有那种类似PHP的托管空间啊,我感觉云服务器都不如PHP那种空间性价比高,奈何实在不喜欢PHP……

    24 条回复    2021-03-09 16:34:43 +08:00
    Plague
        1
    Plague  
       2021-03-07 10:48:54 +08:00
    验证程序注册还要手机号?
    qzhsjz
        2
    qzhsjz  
    OP
       2021-03-07 10:49:34 +08:00
    @Plague #1 是不需要的,这个手机号随便填就行,验证码直接 alert 出来的。
    dorothyREN
        3
    dorothyREN  
       2021-03-07 11:08:37 +08:00
    你这 diango 是用的模板还是自己撸的
    yunsee
        4
    yunsee  
       2021-03-07 12:00:37 +08:00
    csrfmiddlewaretoken
    不失效吗?可以拿来重复使用,就失去验证码的意义了。
    yunsee
        5
    yunsee  
       2021-03-07 12:03:25 +08:00
    <script type="text/javascript">
    const btn = $("#sendvcode");
    let t = 60;
    let iid;
    function sendvcode (phone) {
    $.ajax({
    type: "POST",
    url: "/accounts/register/sendvcode/" + phone,
    data:{"csrfmiddlewaretoken": "35d0T1TEJnF5F8X17iyXldXJ0d4KDI90knMg8MDQz4RYTvKTHOvHbXAfK4818KoX"},
    success: function (data) {
    alert(data);
    btn.attr("disabled",true);
    t = 60;
    iid = setInterval(countdown, 1000);
    },
    error: function (data) {
    alert(data);
    }
    });
    function countdown() {
    t--;
    btn.attr("value", t.toString() + "秒后可重新发送");
    if(t === 0){
    btn.attr("value", "发送验证码");
    btn.attr("disabled",false);
    clearInterval(iid);
    }
    }
    }
    </script>

    Token 直接传给客户端 == 没有验证码
    crab
        6
    crab  
       2021-03-07 12:49:17 +08:00
    看了下载文件名,不会还上了 vmp 吧?
    chinvo
        7
    chinvo  
       2021-03-07 13:03:04 +08:00 via iPhone   ❤️ 1
    vmp 干掉 80%的用户

    防破解本质就是要理解一点:不存在不能被破解的方法,只能是往复杂和恶心人的方向努力。但是切忌造轮子,不然你设计的精妙算法可能就是系统薄弱环节。
    runninghipp
        8
    runninghipp  
       2021-03-07 15:29:38 +08:00
    已经是诈骗页面了
    xuanbg
        9
    xuanbg  
       2021-03-07 17:32:19 +08:00
    完整的程序到了人家手里,那搓圆还是捏扁就都的随人家的意思了。最简单粗暴也最有效的破解方法就是反汇编找到关键点,直接修改字节码跳过你的验证逻辑。百试不爽。
    IDAEngine
        10
    IDAEngine  
       2021-03-07 19:06:28 +08:00
    逻辑都在服务端处理就行了,客户端只做显示和计算
    qzhsjz
        11
    qzhsjz  
    OP
       2021-03-07 22:40:22 +08:00
    @yunsee #5 是这样的,我这次是为了不收集大家手机号,才临时改成接口返回验证码本身,实际上 alert 出来的应该是上层接口返回的“发送成功”、“发送失败”等信息。
    如果说的是 csrftoken 的话,这个东西我是用的 Django 自带的,应该每次刷新都是会变的。
    qzhsjz
        12
    qzhsjz  
    OP
       2021-03-07 22:41:29 +08:00
    @chinvo #7 感谢,我觉得也是。所以尽量没有多造轮子,只是把一些我觉得不太好的轮子以我觉得不错的逻辑重新写了一遍。
    qzhsjz
        13
    qzhsjz  
    OP
       2021-03-07 22:42:45 +08:00
    @xuanbg #9 理论上讲确实是这样的,实际上这个程序用到的所有密钥(除了服务器私钥)我都是存在客户端里的,但是目前还没有人(也可能是没有足够的动力)找出这些密钥。
    qzhsjz
        14
    qzhsjz  
    OP
       2021-03-07 22:43:56 +08:00
    @dorothyREN #3 大后台用的还是 Django 模板,因为本身 Django 的那个大后台做得就很精致很完善。用户后台什么的那些都是自己撸的。
    qzhsjz
        15
    qzhsjz  
    OP
       2021-03-07 22:50:56 +08:00
    @crab #6 确实上了 VMP,但是听说现在 VMP 带壳破解(不脱壳)很容易。
    IDAEngine
        16
    IDAEngine  
       2021-03-08 08:36:34 +08:00
    @qzhsjz VMP 破解很简单的,ESP 定律
    Flymachine
        17
    Flymachine  
       2021-03-08 10:32:48 +08:00
    @qzhsjz 你这个加密传输能防重放攻击吗?拦截一次成功的通讯,然后自建虚拟服务器重放这个通讯,是否可以绕过验证?
    话说,如果重要流程没有插桩,核心代码没有上云。仅仅只是验证上云没什么用途。
    qzhsjz
        18
    qzhsjz  
    OP
       2021-03-08 10:36:49 +08:00
    @Flymachine #17 重放攻击是通过加了时间戳的签名去防的,但用于生成签名的密钥依然存放在本地。我是实在不知道客户端有什么安全的地方可以存放密钥,或者说可能客户端本身由于是受对方控制的所以根本无法信任?
    Flymachine
        19
    Flymachine  
       2021-03-08 10:55:32 +08:00
    时间戳不靠谱,上强随机数来签名吧。客户端主动上传,数据带强随机数并签名,服务器返回时,必须带上客户端传的强随机数+服务器自己的强随机数并签名。

    其实最简单的方式就是核心代码上云,有些重要数据必须是在云上处理后再下发的,而且这个数据不应该是固定的数据。这样就不怕对方搞个虚拟服务器劫持通讯了。
    qzhsjz
        20
    qzhsjz  
    OP
       2021-03-08 11:11:52 +08:00
    @Flymachine #19 强随机数如果只靠接口参数传送的话,应该实际上还是无法避免重放攻击的吧。我觉得如果这样做的话,应该是使用客户端和服务器端都知道的一个算法去生成才行,就是跟 2FA 验证码一样的思路。但是这样的话算法又无法避免放在客户端,可以被逆了……
    ch2
        21
    ch2  
       2021-03-08 12:44:25 +08:00
    @qzhsjz 客户端的加密终将会被 hack,你唯一能做的是警告客户如果乱搞就封号
    Flymachine
        22
    Flymachine  
       2021-03-08 14:51:04 +08:00
    防的是对客户端的重放攻击。如果攻击方想要在不爆破程序的前提下解决这个,就要靠重放服务器验证通过的结果指令。强随机数能保证这样的攻击失效。
    至于爆破程序这样的攻击方式...没辙,真没辙。
    ysc3839
        23
    ysc3839  
       2021-03-09 07:00:05 +08:00 via Android
    关于“PHP 托管空间”的问题,可以了解一下 Serverless,其实跟以前的 PHP 空间有许多相似之处。
    不同 Serverless 服务商支持的语言不同,不过个人调查下来大多数都会支持 Node.js ,所以个人是建议用 Node.js 来写,这样自建或者用 Serverless 都可以。
    目前能免费白嫖的 Serverless 平台大概有 Vercel, Netlify 和 Heroku,都支持 Node.js ,其中 Heroku 支持 Python 。不过需要注意的是,这类免费服务一般都不带数据库功能,可以考虑配合 Google Firebase 的数据库。
    我没了解过现在还有没有什么免费的 PHP 空间,不过就算有,个人也不推荐花时间学习 PHP 了,感觉语言本身的 API 设计得很奇怪,以及不喜欢感觉传统 CGI 的执行模式。
    qzhsjz
        24
    qzhsjz  
    OP
       2021-03-09 16:34:43 +08:00
    @ysc3839 #23 感谢!看来现在 JS 正在取代以前 PHP (最好的语言)的位置。有空还是要多学一学这种东西哈。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:18 · PVG 04:18 · LAX 12:18 · JFK 15:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.