sql注入
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时使用此文件,将不会产生字符型注入,主要是数字型注入。
数字型注入:1
2select * from guess where id=“.$id.”
select * from guess where id=$id
GPC不起作用的情况
数组1
2
3
4$userid=$_POST[userid'];
for($i=0;$i<count($ userid);$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 函数过滤之,如下代码。1
2
3
4
5
6if (!get_magic_quotes_gpc())
{ $lastname = addslashes($_POST['lastname']);
}
else {
$lastname = $_POST['lastname'];
}
对于数字型参数可使用intval 或floatval 强制转换为数字型。
注意mysql的版本以及默认字符集,Mysql>4.1
字符集连接字符串:1
2mysql_query("SET character_set_connection=$dbcharset,
character_set_results=$dbcharset, character_set_client=binary;");
php防范二:
Php5以上版本Mysqli扩展预防,参数化查询1
2
3
4
5
6
7
8$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语言是强类型语言,所有变量定义前必须声明其类型,因而仅存在字符型的注入。
字符型注入实例:1
2String 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”);
文件上传
利用当前系统已有的上传功能,比如文件上传,图像上传等的漏洞来上传任意文件或者webshell。
危害:直接上传webshell到服务器,甚至获取服务器root权限。
各种语言表现大同小异。
ASP上传漏洞表现:
经典的”\0”上传任意后缀文件 。
假设:filename=”c:\nc.exe .bmp”
| N | C | . | E | X | E | (Nul) | . | B | M | P |
|---|---|---|---|---|---|---|---|---|---|---|
| 4E | 43 | 2E | 45 | 58 | 45 | 00 | 2E | 42 | 4D | 50 |
1 | ‘ Check the file extension |
ASP上传漏洞防范:
检查文件名是否包含‘\0’字符。
采用白名单方式允许上传文件类型。
检测关键字:Scripting.FileSystemObject/ADODB.Stream
PHP上传漏洞表现1
2
3
4
5
6
7
8
9
10
11
12$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后缀文件。
采用白名单严格限制上传类型。
JSP文件上传防范:
检测方法:
——File/SmartUpload(常用的一个jsp开源上传组件)
——至/WEB-INF/lib/目录下查看相关upload字样的类库,作为关键字搜索
ASP.net文件上传漏洞:
Asp.net自身提供有上传组件,但默认上传任意后缀文件。
IIS默认解析的后缀名都是不安全的,采用白名单方式上传文件。
ASP.net文件上传漏洞防范:
检查关键字:
PostedFile.FileName/FileUpload
cookie欺骗
Cookie:Web服务器存放在客户端计算机的一些信息,主要用来客户端识别或身份识别等。Session,保存在服务器端的。
Cookie欺骗攻击:攻击者通过修改存放在客户端的cookie来达到欺骗服务器认证目的。
修改工具:IECookiesView
Cookie攻击原理:
If(“登录验证过程”){
setcookie(“isadmin”,1,time()+36002430);
}//登录成功,写入cookie,一个月后失效,用于下次登录。
……
\$admin= \$_COOKIE[“isadmin”];
if(\$admin){
echo “已经登录”;
}else{ echo “请重新登陆”;}
//没对cookie有效性进行验证,导致cookie欺骗产生。
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
其他语言表现。