Web编程常见漏洞与检测
【大 中 小】 浏览:1568 添加日期:2010-8-1 18:50:58
Web漏洞检测白盒检测
对检测者的要求:
——能读懂用此语言写的程序
——明白漏洞成因
——漏洞挖掘经验
常用的web脚本语言:Asp/Php/Jsp/asp.net
常见的web漏洞
sql注入
文件上传
cookie欺骗
XSS攻击
文件包含
其他
Sql注入及其危害
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。
分为字符型注入和数字型的注入,由于编程语言不同,所存在的注入类型也不同。
危害:
--非法查询其他数据库资源,如管理员帐号。
--执行系统命令
--获取服务器root权限
Sql注入原理
Test.asp文件代码片段:
sqlStr = “select * from n_user where username=‘”&username&”’ and password=‘“&password&”’
rs = conn.execute(sqlStr)
正常的查询:test.asp?username=test&password=123
sqlStr = “select * from n_user where username=‘test’ and password=‘123’“
使password=123 ‘ or ‘1’=‘1:
Sql语句到数据库后:
sqlStr = “select * from n_user where username=‘test’ and password=‘123’ or ‘1’=‘1’“
Or ‘1’=‘1’始终成立。
Asp表现
存在数字型和字符型注入。
(A) 数字型 字段=51
Select * from 表名 where 字段=51
构造参数:ID=49 And [查询条件]
生成语句:Select * from 表名 where 字段=49 And [查询条件]
(B)字符型的另一种形式
搜索语句:Select * from 表名 where 字段like ’%关键字%’
构造参数:keyword=’ and [查询条件] and ‘%25’=’
生成语句:Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’
Asp注入的预防
对于用户端输入的任意字符,包括GET提交,POST提交,Cookie提交,SERVER提交的都需要做严格过滤。
对于数字型参数判断是否为数字:可用函数isNumeric来判断,返回值为true和false。
对于字符型参数过滤单引号,使其无法闭合当前sql语句的单引号。
例外:base64编码
Sql通用防注入
Php中的表现
Php的魔术引号(magic_quotes_gpc ) 。
php.ini-dist 默认是开启此功能。如果安装php时使用此文件,将不会产生字符型注入,主要是数字型注入。
数字型注入:
select * from guess where id=“.$id.”
select * from guess where id=$id
GPC不起作用的情况
数组
$userid=$_POST[userid"];
for($i=0;$i $query=“select * from user where i_hid="".$ userid[$i].""";
编码函数引起
base64_decode,base64编码后的单引号:Jw==
mysql处理GBK编码字符%bf%27导致单引号被绕过的问题。
其他数据库,如ms sql。对于转义符反斜杠作为字符处理的。
select * from test where title ="aaa\" or "1"="1‘
Php注入的预防(一)
确认GPC开启,若没开启则用addslashes 函数过滤之,如下代码。
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST["lastname"]);
} else {
$lastname = $_POST["lastname"];
}
对于数字型参数可使用intval 或floatval 强制转换为数字型。
注意mysql的版本以及默认字符集,Mysql>4.1
字符集连接字符串:
mysql_query("SET character_set_connection=$dbcharset,
character_set_results=$dbcharset, character_set_client=binary;");
Php注入的预防(二)
Php5以上版本Mysqli扩展预防,参数化查询
$city = "Amersfoort";
/* create a prepared statement */
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")
$stmt->bind_param("s", $city);
$stmt->execute();
$stmt->bind_result($district);
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
$stmt->close();
}
Jsp 表现
由于java语言是强类型语言,所有变量定义前必须声明其类型,因而仅存在字符型的注入。
字符型注入实例:
String sql = "select * from tb_name where name= ""+varname+"" and passwd=""+varpasswd+""";
stmt = conn.prepareStatement(sql);
构造参数varpasswd值为:" or "1" = "1
Sql语句经过解析后将是:
select * from tb_name = "随意" and passwd = "" or "1" = "1";
Jsp预防
采用jdbc的prepareStatement查询数据库,并且sql语句中不出现参数,如:
sqlStr = “select id from info where city=? and open=? order by id desc”;
stmt = conn.prepareStatement(sqlStr);
stmt.setString(1,city);
stmt.setString(2,var1);
Asp.net表现
开发语言常用的有:vb.net和C#,都属于强类型语言,因而只存在字符型注入。
注入原理,与asp的字符型注入一样。
Asp.net注入预防
使用Ado.net的参数化查询。
strSQL = "SELECT * FROM Orders WHERE CustomerID = @CustomerID";
SqlCommand cmd = new SqlCommand(strSQL, cn);//创建一个sqlcommand对象。
//创建新参数,参数绑定
cmd.Parameters.AddWithValue("@CustomerID", "ALFKI");
sql注入的检测简单流程
文件上传漏洞
利用当前系统已有的上传功能,比如文件上传,图像上传等的漏洞来上传任意文件或者webshell。
危害:直接上传webshell到服务器,甚至获取服务器root权限。
各种语言表现大同小异。
Asp上传漏洞表现
经典的”\0”上传任意后缀文件 。
假设:filename="c:\nc.exe .bmp"
‘ Check the file extension
if right(tFile,4) <> “.bmp” then exit sub
tFile=tFile &".bmp"
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
Set FSOFile=
FSO.CreateTextFile(FSO.BuildPath(Path, tFile))
Asp上传漏洞预防/检测
检查文件名是否包含‘\0’字符。
采用白名单方式允许上传文件类型。
检测关键字:Scripting.FileSystemObject/ADODB.Stream
Php上传漏洞表现
$imageinfo = getimagesize($_FILES["userfile"]["tmp_name"]);
if($imageinfo["mime"] != "image/gif" && $imageinfo["mime"] != "image/jpeg") {
if($_FILES["userfile"]["type"] != "image/gif") {
echo “仅允许上传GIF和JPEG图片\n"; exit;
}
$uploaddir = "uploads/";
$uploadfile = $uploaddir . basename($_FILES["userfile"]["name"]);
if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile)) {
echo “文件上传成功.\n";
} else {
echo “上传失败.\n";
}
Php上传漏洞预防/检测
检查上传文件名中是否存在.php字符。
采用白名单,仅允许安全的类型,如gif/jpg/rar等,禁止用户自定义文件后缀。
检测关键字:move_uploaded_file/is_uploaded_file/copy
Jsp文件上传漏洞/预防/检测
后缀检查不严引起的上传任意文件,主要为jsp和war后缀文件。
采用白名单严格限制上传类型。
检测方法:
——File/SmartUpload(常用的一个jsp开源上传组件)
——至/WEB-INF/lib/目录下查看相关upload字样的类库,作为关键字搜索。
Asp.net 文件上传漏洞/预防/检测
Asp.net自身提供有上传组件,但默认上传任意后缀文件。
IIS默认解析的后缀名都是不安全的,采用白名单方式上传文件。
检查关键字:
PostedFile.FileName/FileUpload
Cookie 欺骗攻击
Cookie:Web服务器存放在客户端计算机的一些信息,主要用来客户端识别或身份识别等。Session,保存在服务器端的。
Cookie欺骗攻击:攻击者通过修改存放在客户端的cookie来达到欺骗服务器认证目的。
修改工具:IECookiesView
Cookie攻击原理
If(“登录验证过程”){
setcookie("isadmin”,1,time()+3600*24*30);
}//登录成功,写入cookie,一个月后失效,用于下次登录。
……
$admin= $_COOKIE[“isadmin"];
if($admin){
echo “已经登录”;
}else{ echo “请重新登陆”;}
//没对cookie有效性进行验证,导致cookie欺骗产生。
Cookie欺骗预防
禁用cookie,采用session。一般适合web系统安全性要求比较高的情况下
——后台管理等。
增加多参数验证cookie有效性。
——如验证访问者ip是否与上次IP一样等。
Cookie欺骗检测
关键字检测
Asp:
Response.Cookies/Request.Cookies
Php:
Setcookie/$_COOKIE/$HTTP_COOKIE_VARS
Jsp:
response.addCookie /request.getCookies
Asp.net:
response.Cookies/request.Cookies
XSS(跨站脚本攻击)
跨站脚本攻击(通常简写为XSS)是指攻者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
危害:
——盗取用户cookie
——Xss蠕虫
——挂马,结合xss蠕虫,危害巨大。
Xss防范
对用户输入数据编码:
Asp:server.htmlencode函数
Php:htmlspecialchars函数
asp.net:HttpContext.Current.Server.HtmlEncode
jsp:默认没有提供过滤方法,需要自写方法。
过滤危险的html关键字符:
比如:script/iframe等。
XSS检测
搜索关键字。
Asp:request/
Php:$_GET/$_POST/$_COOKIE/$_SERVER
Jsp:request.getParameter/ request.getCookies
Asp.net:Request.QueryString/Form/Cookies/SeverVaiables/
Php 文件包含漏洞
Php:include/require / include_once /require_once函数使用时参数没有限制导致可以包含远程文件或者本地文件。
Php4存在远程&本地,php5仅存在本地包含。
检测: include/require/include_once /require_once
其他语言表现。
其他漏洞检测
信息泄露
权限验证不严
仅仅罗列了一些常见的漏洞情况,实际上检测难度将比这个代码复杂的多了,这就要求我们对程序有足够的了解。
php脚本示例
回复删除使用Singleton模式的PHP5数据库对象