SQL注入
1、简述
web程序中对于用户提交参数没有过滤直接放到SQL语句中执行,打破了SQL语句逻辑,获取信息,执行命令等。
2、预防手段
1. 减少网站显示SQL错误信息,像类型错误,字段不匹配等,可以防止黑客获取相关信息;
2. 限制用户对于数据库的操作权限;
3. 对进入数据库的特殊字符进行转义处理或者编码转换;
4. 网站数据层进行编码统一;
5. 查询语句使用参数化查询接口;
6. 限制用户输入长度;
7. 确定数据库中数据类型。
3、SQL注入原理
• 从前端传给后端的参数内容是用户可以控制的
• 传入的参数是可以拼接到SQL语句中执行
4、SQL注入常规思路
1. 找注入点,手工或者web扫描工具实现
2. 通过注入点,获取有关数据库信息,像数据库用户名、数据库名称、数据库版本等信息
3. 猜测数据库表重要字段和内容,像存放管理员账户表名等
4. 通过获取的用户信息,进行登录
5、手工注入思路
1. 判断是否存在注入,注入是字符型还是数字型
2. 猜解SQL 查询语句中的字段数order by N
3. 确定显示的字段顺序
4. 获取当前数据库
5. 获取数据库中的表
6. 获取表中的字段名
7. 查询到账户的数据
6、SQL花式注入手段
• 延迟注入:属于盲注入,一般是某个注入点无法通过布尔型注入后去数据而采取的一种突破注入的技术手段,判断注入可以使用“and sleep(10)”让数据库延时10秒返回,网页响应至少需要10秒,根据这个原理判断存在SQL时间注入。例:select if(length(database())>1,sleep(5),0) 这个就是查询当前库大于1 就会延时5 秒执行。
• 堆叠注入:堆叠查询可以执行多条SQL 语句,语句之间以分号(;)隔开,而堆叠查询注入攻击就是利用此特点,在第二条语句中构造要执行攻击的语句。在mysql 里mysqli_multi_query 和mysql_multi_query这两个函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。他可以任意使用增删改查的语句,例如删除数据库修改数据库,添加数据库用户。
• 二次注入攻击:在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes 或者是借助get_magic_quotes_gpc 对其中的特殊字符进行了转义,但是addslashes 有一个特点就是虽然参数在过滤后会添加“\” 进行转义,但是“\”并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行下一步的检验和处理,这样就会造成SQL 的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。
• 宽字节注入:在SQL 进行防注入的时候,一般会开启gpc,过滤特殊字符。一般情况下开启gpc 是可以防御很多字符串型的注入,但是如果数据库编码不对,也可以导致SQL 防注入绕过,达到注入的目的。如果数据库设置宽字节字符集gbk 会导致宽字节注入,从而避开gpc。
• base64编码注入:在php 中base64_encode()函数对字符串进行base64 编码,既然可以编码也可以进行解码,base64_decode()这个函数对base64 进行解码。base64 编码注入,可以绕过gpc 注入拦截,因为编码过后的字符串不存在特殊字符。编码过后的字符串,在程序中重新被解码,再拼接成SQL 攻击语句,再执行,从而形式SQL 注入。
7、SQL绕过技术
• 空格字符绕过:两个空格代替一个空格,用Tab 代替空格,%a0=空格
%20 %09 %0a %0b %0c %0d %a0 %00 /*/ /!*/
select * from users where id=1 /!union//!select/1,2,3,4;
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空格
• 大小写绕过:将字符串设置为大小写,例如and 1=1 转成AND 1=1 AnD 1=1
select * from users where id=1 UNION SELECT 1,2,3,4;
select * from users where id=1 UniON SelECT 1,2,3,4;
• 浮点数绕过注入:select * from users where id=8E0union select 1,2,3,4;select * from users where id=8.0union select 1,2,3,4;
• NULL 值绕过:select * from users where id=\Nunion select 1,2,3,\N;select * from users where id=\Nunion select 1,2,3,\Nfrom users;
• 引号绕过:如果waf 拦截过滤单引号的时候,可以使用双引号在mysql 里也可以用双引号作为字符串。select * from users where id='1';select * from users where id="1";
• 添加库名绕过:
• 以下两条查询语句,执行的结果是一致的,但是有些waf 的拦截规则并不会拦截[库名].[表名]这种模式。select * from users where id=-1 union select 1,2,3,4 from users;select * from users where id=-1 union select 1,2,3,4 from 123.users;
• 去重复绕过:在mysql 查询可以使用distinct 去除查询的重复值。可以利用这点突破waf 拦截,select * from users where id=-1 union distinct select 1,2,3,4 from users;select * from users where id=-1 union distinct select 1,2,3,version() from users;
• 反引号绕过:在mysql 可以使用这里是反引号绕过一些waf 拦截。字段可以加反引号或者不加,意义相同。insert into users(username,password,email)values('123','123456','admin@123.com');insert intousers(username,password,email)values('123','123456','admin@123.com')
• 双关键词绕过:有些程序会对单词union、select 进行转空但是只会转一次这样会留下安全隐患。id=-1'union on selselect1,2,3--+到数据库里执行会变成id=-1'UNION select1,2,3--+ 从而绕过注入拦截。
• 二次编码绕过:有些程序会解析二次编码,造成SQL 注入,因为url 两次编码过后,waf 是不会拦截的。
文件上传漏洞
1、漏洞简述
文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件。如常见的头像上传,图片上传,oa 办公文件上传,媒体上传,允许用户上传文件等。
2、文件上传过程
服务器代码
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
客户端:
Filename:
返回值:
0:没有错误发生,文件上传成功。
1:上传的文件超过了php.ini 中upload_max_filesize 选项限制的值。
2:上传文件的大小超过了HTML 表单中MAX_FILE_SIZE 选项指定的值。
3:文件只有部分被上传。
4:没有文件被上传。
3、文件上传漏洞预防
• 在网站中需要存在上传模块,需要做好权限认证,不能让匿名用户可访问。
• 文件上传目录设置为禁止脚本文件执行。这样设置即使被上传后门的动态脚本也不能解析,导致攻击者放弃这个攻击途径。
• 设置上传白名单,白名单只允许图片上传如,jpg png gif 其他文件均不允许上传
• 上传的后缀名,一定要设置成图片格式如jpg png gif
4、文件上传的攻击方法
寻找测试网站的文件上传的模块,常见头像上传,修改上传,文件编辑器中文件上传,图片上传、媒体上传等,通过抓包上传恶意的文件进行测试,上传后缀名asp php aspx 等的动态语言脚本,查看上传时的返回信息,判断是否能直接上传,如果不能直接上传,再进行测试上传突破,例如上传文件的时候只允许图片格式的后缀,但是修改文件时,却没有限制后缀名,图片文件可以修改成动态语言格式如php,则可能访问这个文件的URL 直接getshell,可以控制网站。
5、文件上传漏洞的预防
服务器端使用白名单防御,修复web 中间件的漏洞,禁止客户端存在可控参数,存放文件目录禁止脚本执行,限制后缀名一定要设置图片格式jpg、gif 、png 文件名随机的,不可预测。
XSS漏洞
1、漏洞简介
XSS 攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS 是一种在web 应用中的计算机安全漏洞,它允许恶意web 用户将代码植入到web网站里面,供给其它用户访问,当用户访问到有恶意代码的网页就会产生xss 攻击。
2、XSS 攻击的危害包括
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
3、xss 漏洞的类型
• 反射型XSS:反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS 代码。反射型xss 攻击的方法,攻击者通过发送邮件或诱导等方法,将包含有xss 恶意链接发送给目标用户,当目标用户访问该链接时,服务器将接收该用户的请求并进行处理,然后服务器把带有xss 恶意脚本发送给目标用户的浏览器,浏览器解析这段带有xss 代码的恶意脚本后,就会触发xss 攻击。
• 存储型XSS:持久化,代码是存储在服务器中的数据库里,如在个人信息或发表文章等地方,可以插入代码,如果插入的数据没有过滤或过滤不严,那么这些恶意代码没有经过过滤将储存到数据库中,用户访问该页面的时候,没有进行编码过滤输出到浏览器上,就会触发代码执行,造成xss 攻击。
• dom 型xss:DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。DOM 型XSS 其实是一种特殊类型的反射型XSS,它是基于DOM 文档对象模型的一种漏洞。在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS 脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM 来动态修改页面内容,从客户端获取DOM 中的数据并在本地执行。基于这个特性,就可以利用JS 脚本来实现XSS 漏洞的利用。
4、xss 编码绕过
• gpc 过滤字符
如果gpc 开启的时候,特殊字符会被加上斜杠即,'变成' xss 攻击代码不要带用单引号或双引号。
绕过gpc 在php 高版本gpc 默认是没有的,但是开发程序员会使用addcslashes()对特殊字符进行转义。
这个是执行不了的
没有单引号可执行。
• 过滤alert
当页面过滤alert 这个函数时,因为这个函数会弹窗,不仅很多程序会对他进行过滤,而且很多waf 都会
对其进行拦截。所以不存在alert 即可。
• ascii 编码
• url 编码
• base64 编码
使用伪协议base64 解码执行xss
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)