1.请尽可能列举你知道的网站未能正确使用图片验证码机制的情况,以及如何绕过其限制?
- 图形验证码的内容可OCR识别
- 多阶段的过程,先校验验证码,成功之后的下一步不需要验证码,可以直接抓包,跳过第一步的验证
- 验证码在服务段校验后,没有立即失效,需要客户端再次请求才会更新,只要客户端不再请求验证码即可使用原来的验证码
- 生成验证码的模块是否根据提供的参数生成验证码,如果是说明存在漏洞
- 有些验证码与数据包中的某个参数绑定,比如cookie中的某个属性,只要它们相匹配,验证码就认为是有效的。这种机制存在漏洞。
- 在某些情况下,验证码隐藏在HTML源码或通过其他方式获得“明文”
- 在服务器端,是否只有在验证码检验通过后才进行用户名和密码的检验,如果不是说明存在漏洞。
-有些网站默认不显示验证码,而是在输入错误一定数量之后才需要验证验证码,开发人员可能在Cookie中写入一个标记loginErr,用来记录错误数量,则可以不更新Cookie中的loginErr值反复提交,验证码就不会出现。
-服务端没有对验证码参数进行非空判断(删除验证码参数值或者全部删除)
-验证码不过期,没有及时销毁会话导致同一验证码反复可用。
-输入验证码点击登录抓包之后,如果页面不刷新或者说验证码不刷新,该验证码可以一直使用
2.请尽可能列举你知道的网站未能安全实现文件上传功能的情况,以及如何绕过其限制?
允许直接上传脚本文件:php、jsp、aspx
结合web server解析漏洞
一、IIS 5.x/6.0解析漏洞
IIS 6.0解析利用方法有两种
1.目录解析 /xx.asp/xx.jpg
2.文件解析 wooyun.asp;.jpg
二、IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞
在默认Fast-CGI开启状况下,黑阔上传一个名字为wooyun.jpg,内容为
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>的文件
然后访问wooyun.jpg/.php,在这个目录下就会生成一句话木马 shell.php
三、Nginx <8.03 空字节代码执行漏洞
影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
Nginx在图片中嵌入PHP代码
然后通过访问xxx.jpg%00.php来执行其中的代码
四、Apache解析漏洞
Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.
比如wooyun.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php.
五、其他
在windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单.若上传成功,空格和点都会被windows自动消除,这样也可以getshell。
如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:
<FilesMatch "wooyun.jpg"> SetHandler application/x-httpd-php </FilesMatch>
然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件。
前端文件名限制
firebug禁用javascript
firebug修改允许上传类型
Burp绕过限制
本地构造html代码
后端检测-MIME
修改MIME类型
后端检测-文件头
我们可以通过使用jpg图片马来绕过!
后端检测-文件扩展名,黑名单与白名单
大小写
寻找黑白名单的遗漏点
配合解析漏洞来绕过
%00和\x00截断
文件内容绕过:
图片马
加密webshell
填充垃圾数据
3.利用汇编语言编写一道程序,不使用乘法以及除法指令,计算(((AX*5)+300h)/2-100h)*8的值。
mov bx,ax
shl ax,2
add ax,bx
add ax,300h
shr ax,1
sub ax,100h
shl ax,3
4.阅读如下代码,其中main函数参数可以被攻击者控制,那么main函数中存在哪些漏洞,指出漏洞具体位置及问题,并说明这些代码中漏洞的修复方法
//读取指定的文件中的内容并返回该文件base64编码后的内容,函数失败则返回NULL,在非NULL情况下需要调用该函数后手动释放内存,该函数中不存在安全性问题
char *readBase64File(char *fileName);
int main(int argc, char* argv[])
{
char filePath[260];
char fileCmd[512];
char *fileName;
int dirIdx;
char *fileContent;
char *dirPaths[4];
dirPaths[0] = ”/home/data1/”;
dirPaths[1] = ”/home/data2/”;
dirPaths[2] = ”/home/data3/”;
dirPaths[3] = ”/home/data4/”;
fileName = argv[1];
dirIdx = atoi(argv[2]);
if (dirIdx > 3)
{
printf(“file index error!\n”);
return -1;
}
strcpy(filePath, dirPaths[dirIdx]);
if (strlen(filePath) + strlen(fileName) < 260)
strcat(filePath, fileName);
else
return -1;
fileContent = readBase64File(filePath);
if (fileContent == NULL)
{
printf(“read filecontent error!\n”);
}
else
{
printf(“file content is: %s\n”, fileContent);
free(fileContents);
}
strcpy(fileCmd, “rm ”);
strcat(fileCmd, fileName);
printf(fileCmd);
system(fileCmd);
return 0;
}
答案:命令执行,目录穿越,缓冲区溢出,数组越界访问,格式化字符串
(1)system(fileCmd);处存在命令执行漏洞及任意文件删除问题,需要进行命令执行过滤
(2)printf(fileCmd);处存在格式化字符串漏洞,此处可以通过%s来打印命令
(3)fileContent =readBase64File(filePath);处存在目录穿越,任意文件读取漏洞,此处可以对../这种目录穿越特征进行过滤
(4)strcpy(filePath, dirPaths[dirIdx]);处存在数组访问越界,从而可以也可以导致缓冲区溢出问题,判断有符号数的dirIdx时需要判断其大于等于0