浅谈Web开发中的代码安全——HTML、PHP等 篇一:SQL注入与XSS

文章版权©归属本文作者:南城无笙(NorthCity Mr.Silence)所有,禁止一切盗版、未经同意的转载行为,一旦发现必将与CSDN沟通,同时追究其责任。Logo
非法转载必追究责任,本文章分多篇更新。

声明

本文中,部分有关Web漏洞的历史及第一次出处参考了道哥的《白帽子讲Web安全》如侵犯著作权,请联系我进行内容调整。

代码安全重要性

代码安全其实在网络资产中具有着很重要的地位。
比如一个厂商或者个人的Web资产,代码安全方面出现了问题,导致了诸多高危漏洞,造成的损失与剩下的时间相比,轻重显而易见。
本篇文章的侧重点就在于浅谈Web安全中的重要漏洞 以及其的代码规范。

OWASP TOP10 A1:Injection

Web安全的头等大敌自然要数SQL注入了,这个漏洞在刚出现时可谓轰动了网络安全行业,一夜之间,各大厂商的Web资产都变得处于危险之中,SQL注入也可以成为网络安全行业的一大里程碑事件。
如图是OWASP TOP10 RC2内部发行版本的SQLi排行,在每次的评级中,无一例外,SQLi都是A1级别。:
在这里插入图片描述

下面进入Injection漏洞的正题:
一名名为RFP的黑客发布的一篇文章*(NT Web Technology Vulnerabilities)中,介绍这种漏洞,及其攻击技巧。
下面是一个典型的例子:

var Name;
Name = Request.form ("ExampleTest");
var sql = "select * from TestTable where Name='"+Name+"'"
=====>Example Code<=====

那么正常情况下,用户通过提交数据:Tom,则语句变成了如下的情况:

SELECT * FROM TestTable where Name = "Tom"

上述是正常的生产环境中正常功能实现,但是如果用户构造一段SQL语句:

Tom'; drop table TestTable--

那么,真正所执行的语句,就变成了:

SELECT * FROM TestTable WHERE Name= 'Tom';drop table Testtable--'

所以,这个地方构成了一段代码注入,导致了意外地SQL查询执行,通过SQL注入Payload可以攻击目标的数据库,将数据库中的数据越权下载(即被常提起的“拖库”)
SQL注入也包含很多类型,例如最简单的Union联合查询注入、Error 注入、Timing Injection等,同时,很多injection漏洞也可以导致命令执行(导出webshell或利用自定义函数执行命令,有些时候构造sqlmap语句,可以直接getshell,例如:

sudo sqlmap -u "http://example/..?id=1" --os-shell

那么,下面来介绍下SQL注入的代码防御:
对于SQL注入,只进行简单的过滤是不安全的,例如:

$sql = "SELECT id,name FROM register WHERE id=".mesql_real_escape_string($_GET['id'])""

这段代码其实针对SQLi的payload进行了很小程度的防护,但是远远不够,如果构造payload为:

www.example.com/index.php?id=12,AND,1=0,union,selec
t,1,concat(user,0x3a,password),3,4,5,6,7,from,sql.user
,where,user=substring_index(current_user(),char(64),1)

那么,防御SQL注入的最好方式究竟是什么呢?
一般情况下,最好的方式就是使用预编译语句,比如在这段java代码中:

$query = "INSECT INTO MyCity (Nmap,CountryCode,District) VALUES (?,?,?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("sss",$val1,$val2,$val3);
$val1 = "Stuttgart";
$val2 = "DEU"
$val3 = "Baden-Wuerttemberg";
/* Execute the Statement */
$stmt->execute();

上述是预编译语句的例子(例子代码借鉴于《白帽子讲web安全》)
下面介绍一下检查输入数据类型的方法:

<?php

settype($offset,'integer');
$query = "SELECT id FROM Test ORDER BY id LIMIT 20 OFFSET $offset;";
$query = sprintf("SELECT id FROM Test ORDER BY id LIMIT 20 OFFSET %d;,$offset");

?>

同时,使用安全的函数也可以大幅度避免SQL注入的出现。

XSS(Cross Domain Script)

XSS,全程Cross Domain Script,跨站脚本,因为和层叠样式表CSS区分,叫做XSS。是OWASP TOP10中的A7级别漏洞(内部发行版RC2)
XSS的出现,可以说是网络安全行业的第二个里程碑
现如今,通过XSS(一般危害大的XSS都是存储型的XSS)加载hook,钩住用户浏览器的也并不少见。
下面来举个XSS的例子:

<?php

$input = $GET["INPUT"];
echo "<div>".$input."</div>";
?>

上面的代码,直接的将用户输入的内容输出
如果访问http://example.com/php?INPUT=hello!
那么,源代码就是:

<?php

$input = $GET["INPUT"]
echo "<div> hello!</div>"

但是如果提交一段HTML代码,那么:
访问http://example.com/test.php?INPUT=
那么源代码就变成了:

<?php
 $input = $GET["INPUT"];
 echo "<div><script>alert(/xss/)</script></div>";

这是会触发XSS漏洞,导致HTML代码注入,这个代码会造成一个alert弹窗,弹出一个JS脚本形式的弹窗,弹窗内容是/XSS/。
通过src等标签,可以加载URL,通过这个URL,可以加载一个类似于Worm‘的JS代码,从而诱使目标访问,然后hook对方的浏览器,可以进行很多操作,其中包括但不限于:alert弹窗、录制屏幕、上传文件等。
那么,防御XSS攻击也是一个重点。
防御XSS的一种非常好的方法之一就是HTTPOnly,HTTPonly可以防止cookie劫持,从本质上导致XSS漏洞即视被成功利用也不能造成什么大的危害,HTTPOnly一般是在setcookie时使用的。
HTTPonly的使用十分灵活,实例如下:

<?php

header("Set-Cookie:cookie1=test;httponly",false);
?>

以上实例就是使用了HTTPonly来防止Cookie劫持,达到一个以柔克刚的作用。
同时还可以利用输入检查,配合WAF可以有奇效。

总结

这篇文章由于作者时间原因只谈论了两个漏洞,在以后会介绍更多漏洞。
其实,这里介绍的只是一些代码上的注意事项,还可以使用WAF来进行防御,包括软件WAF、硬件WAF设备、云WAF等,不过WAF的拦截规则终归是人设计的,所以必定存在可以绕过的方式,所以,安全并不是一个可以有一个完美的解决方案的问题,他是一个长久的,与恶意攻击者斗争的一个过程。这个过程需要厂商技术人员和所有白帽子的努力,来完善这个网络的安全。
希望这篇文章可以对那些为Web安全而奋斗的人有所帮助、启发。希望所有人重视网络安全。(这也是就最近8e Q绑泄露而想说的)。
最后再次声明:本作者所有文章,未经本人允许,不准转载、盗版,所有侵权行为,本人均会选择维权。(最近很多不知廉耻的人盗文章,就此说明!洁身自好) Copyright:南城无笙
在这里插入图片描述

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页