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

2021-03-07 10:44:30 +08:00
 qzhsjz

网站用的是 Django 。

http://198.55.123.196/

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

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

3470 次点击
所在节点    程序员
24 条回复
Plague
2021-03-07 10:48:54 +08:00
验证程序注册还要手机号?
qzhsjz
2021-03-07 10:49:34 +08:00
@Plague #1 是不需要的,这个手机号随便填就行,验证码直接 alert 出来的。
dorothyREN
2021-03-07 11:08:37 +08:00
你这 diango 是用的模板还是自己撸的
yunsee
2021-03-07 12:00:37 +08:00
csrfmiddlewaretoken
不失效吗?可以拿来重复使用,就失去验证码的意义了。
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
2021-03-07 12:49:17 +08:00
看了下载文件名,不会还上了 vmp 吧?
chinvo
2021-03-07 13:03:04 +08:00
vmp 干掉 80%的用户

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

其实最简单的方式就是核心代码上云,有些重要数据必须是在云上处理后再下发的,而且这个数据不应该是固定的数据。这样就不怕对方搞个虚拟服务器劫持通讯了。
qzhsjz
2021-03-08 11:11:52 +08:00
@Flymachine #19 强随机数如果只靠接口参数传送的话,应该实际上还是无法避免重放攻击的吧。我觉得如果这样做的话,应该是使用客户端和服务器端都知道的一个算法去生成才行,就是跟 2FA 验证码一样的思路。但是这样的话算法又无法避免放在客户端,可以被逆了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX