程梦成,叶 丹
(广东电网有限责任公司河源供电局,广东 河源 517000)
南方电网公司每年都会委派网络安全专家对各地市局的电力二次系统进行渗透测试,各地市局根据等保测评结果进行相应整改。Web应用属于电力二次系统的管理信息大区,相比生产控制大区的SCADA/EMS等系统,Web应用的安全往往容易被忽略。网络安全管理人员应该提高对Web应用漏洞的重视程度,防患于未然。
Web漏洞主要分为客户端和服务端两大类[1]。
客户端的漏洞主要有跨站脚本攻击(Cross Site Scripting,XSS)和跨站请求伪造(Cross-Site Request Forgery,CSRF)。
1.1.1 XSS漏洞
为了与层叠样式表(Cascading Style Sheets)的缩写区分,将跨站脚本攻击记为XSS。XSS是指攻击者向Web页面插入恶意代码,而服务器或浏览器对提交的数据过滤不足,当用户浏览该页面时,嵌入其中的恶意脚本会被执行[2]。
反射型XSS是最常见的。攻击者通常需要诱骗用户点击一个特定链接,这样恶意代码才会在用户的浏览器上执行,所以又称为非持久型XSS。DOM型XSS可以看作反射型XSS的一种特例。
相比反射型XSS而言,存储型XSS的危害要大得多。存储型XSS通过论坛或贴吧将用户发表的内容存储到服务器,其他用户只要浏览该内容,就会在他们的浏览器上执行恶意代码。
1.1.2 CSRF漏洞
CSRF可以通俗理解为利用被攻击者的身份发送请求。CSRF攻击的原理很简单:某用户登陆受信任网站A,验证通过,网站A产生Cookie并返回给浏览器;该用户在退出网站A之前,在当前浏览器中访问恶意网站B;此时网站B请求访问第三方网站A,浏览器会带上网站A产生的Cookie,所以网站B对网站A的请求等同于用户使用浏览器再次访问网站A,而实际上该操作用户是不知情的。
需要说明的是,XSS是利用用户输入的不严谨执行JS语句,而CSRF则是通过伪造受信任用户发送请求。CSRF可以通过XSS来实现。
服务端漏洞主要分为SQL注入漏洞和文件上传漏洞。
1.2.1 SQL注入漏洞
SQL注入是指网站未对攻击者提交的数据严格过滤,这些SQL语句的执行导致数据库敏感信息泄露[3]。
SQL注入按照页面返回结果分为两大类。
第一类,有回显。攻击者可以根据回显内容判断是否注入成功。步骤如下:(1)判断是否存在注入(字符型还是数字型);(2)猜解SQL查询语句中的字段数(order by 或union select);(3)确定显示的字段顺序;(4)获取当前数据库;(5)获取数据库中的表;(6)获取表中的字段名;(7)下载数据。
第二类,没有回显,也就是盲注,通常分为bool型和延迟型。数据库名、表名以及字段名需要比较ASCII字符进行猜解,其他步骤同上。需要注意,攻击者通常会使用SQLMAP等自动化工具提高注入效率。
1.2.2 文件上传漏洞
一般网站都有上传头像或者附件的功能,如果文件上传验证不严格,网站会被攻击者上传木马,危害极大。攻击者一般需要绕过以下几种检测方式:(1)javascript,用抓包工具改文件后缀;(2)MIME类型,用抓包工具修改Content-type关键字;(3)目录路径,用%00进行截断;(4)文件扩展名,对黑名单使用大小写或者特殊文件名绕过,对白名单使用%00和解析漏洞绕过;(5)文件内容,在文件幻数后加一句话木马等。
可以过滤用户输入的字符串,验证输入的长度和类型是否符合要求,对特殊字符进行转义处理;对输出数据进行URL、HTML编码;服务端使用CSP(Content Security Policy)策略,用来确定浏览器可以加载哪些资源,从而减少XSS的发生;如果浏览器支持HttpOnly字段,那么浏览器无法通过JS脚本读取Cookie。
可以检查HTTP请求头Refer字段,如果来源是非站内地址,表示有可能受到了CSRF攻击。此外,通过减少客户端Cookie和服务端Session的有效时间,也可以降低CSRF攻击的可能性。最有效的方法是Anti-CSRF Token。客户每次访问时服务端会随机生成一次性Token,当恶意网站B访问第三方站点A时,产生的Token和用户直接访问网站A的Token是不一样的。如果客户端的Token和服务端的Token不匹配,服务端会拒绝提供服务。
在开发阶段,输入需要严格验证,要遵循安全编码规范。例如,在JSP中用PreparedStatement代替Statement,将PHP的magic_quotes_gpc设置为打开,以防范大多数SQL注入。此外,应该加固数据库,如单独为应用创建有限访问账户,限制用户能够访问的数据库表。
文件上传漏洞的防御基本上对应1.2.2中提到的5种检测方式。其中:对图片进行二次渲染,基本上避免了文件上传漏洞;文件扩展名检测尽量使用白名单过滤。值得一提的是,攻击者即使成功上传了webshell,也需要得到webshell的路径。所以,避免在任何地方暴露上传文件的地址,或者用时间戳、随机字符串等方式对文件重命名。
我国绝大部分的电力二次系统都有一定的Web漏洞隐患,需要及时加以防范。Web应用安全漏洞的本质是对用户输入的信任,开发者考虑的是可以做什么,而攻击者往往考虑还可以做什么。开发者在开发设计时应该规范用户行为,加强表单验证,采用白名单安全策略,使数据与代码分离,最大程度减少Web漏洞。