base64编码补位的坑,导致数据验证被绕过,也绕过了系统黑名单的检测。
背景
突然,测试人员找上我,说篡改某对象ID的值会绕过系统的黑名单检测!
我非常不相信,因为该对象ID生成有随机因素,而且它的校验也有hash判断,只要校验不通过,立马会拒绝。
他把那个对象ID发给我,是这样的
NWE3MGQzMTBhYWYyODUxZTFlN2QwOWY2OWFmOGE5ZjMtMmUzOGIxZWNlZTVkNDUzNjkyYTg2NDAxYTVhZjk0MzUwMDAyLUx3QTF1OGpXWC8zelM2TUt0NG9pbW1qZzVEOD1=
是基于下面这个值改的。
NWE3MGQzMTBhYWYyODUxZTFlN2QwOWY2OWFmOGE5ZjMtMmUzOGIxZWNlZTVkNDUzNjkyYTg2NDAxYTVhZjk0MzUwMDAyLUx3QTF1OGpXWC8zelM2TUt0NG9pbW1qZzVEOD0=
第一个是篡改后的,第二个是原始生成的。第一个和第二个的差别是倒数第二个字符由0改为1
定位过程
原始的字符串是经过base64编码生成。用于base64解码一下
代码语言:javascript复制>>> origin = "NWE3MGQzMTBhYWYyODUxZTFlN2QwOWY2OWFmOGE5ZjMtMmUzOGIxZWNlZTVkNDUzNjkyYTg2NDAxYTVhZjk0MzUwMDAyLUx3QTF1OGpXWC8zelM2TUt0NG9pbW1qZzVEOD0="
>>> modified = "NWE3MGQzMTBhYWYyODUxZTFlN2QwOWY2OWFmOGE5ZjMtMmUzOGIxZWNlZTVkNDUzNjkyYTg2NDAxYTVhZjk0MzUwMDAyLUx3QTF1OGpXWC8zelM2TUt0NG9pbW1qZzVEOD1="
>>> origin == modified
False
>>> origin_decode = base64.b64decode( origin )
>>> modified_decode = base64.b64decode( modified )
>>> origin_decode == modified_decode
True
>>> origin_decode
b'5a70d310aaf2851e1e7d09f69af8a9f3-2e38b1ecee5d453692a86401a5af94350002-LwA1u8jWX/3zS6MKt4oimmjg5D8='
>>> modified_decode
b'5a70d310aaf2851e1e7d09f69af8a9f3-2e38b1ecee5d453692a86401a5af94350002-LwA1u8jWX/3zS6MKt4oimmjg5D8='
WTF, 这是怎么回事,为什么两个解码的结果是一样的?再继续修改看看是怎么回事?
剩余内容请关注本人公众号debugeeker, 链接为base64的天坑