1、某系统存在防注入模块,注入时会被提示:
如何利用这个防注入系统拿shell?
既然回显IP,就可以在URL里面直接提交一句话, 可以尝试一句话?eval($_post["a"]);这样网站就把一句话也记录进数据库文件了。这个时候可以尝试寻找网站的配置文件,直接上菜刀链接。也可以尝试burp抓包进行http头部注入(X-fowarded-for字段注入)。
2、 发现test.jsp?id=1234 注入点,你有哪几种思路获取 webshell,哪种是优选?
(1)有root权限以及写文件的权限,可以构造联合查询语句使用using INTO OUTFILE,可以将查询的输出重定向到系统的文件中,这样去写入WebShell
(2)使用sqlmap –os-shell,原理和上面一种相同,来直接获得一个 Shell,这样效率更高
(3)通过构造联合查询语句得到网站管理员的账户和密码,然后扫后台登录后台,再在后台通过改包上传等方法上传Shell
3、CSRF 和 XSS 和 XXE 有什么区别,以及修复方式?
(1)XSS是跨站脚本攻击,用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等攻击。修复方式:对字符实体进行转义、使用HTTP Only来禁止JavaScript读取Cookie值、输入时校验、浏览器与Web应用端采用相同的字符编码。
(2)CSRF是跨站请求伪造攻击,XSS是实现CSRF的诸多手段中的一种,是由于没有在关键操作执行时进行是否由用户自愿发起的确认。修复方式:筛选出需要防范CSRF的页面然后嵌入Token、再次输入密码、检验Referer
(3)XXE是XML外部实体注入攻击,XML中可以通过调用实体来请求本地或者远程内容,和远程文件保护类似,会引发相关安全问题,例如敏感文件读取。修复方式:XML解析库在调用时严格禁止对外部实体的解析,过滤掉system等关键词,过滤掉用户提交的XML数据
4、写出病毒木马常用的hook技术以及大致实现。
(1)INLINE HOOK将需要hook的api函数入口的部分代码修改为跳转代码,如将函数的 序言代码push ebp;mov ebp,esp等代码修改为jmp hook_func的指令
(2)IAT HOOK遍历可执行程序的导入表,并修改导入表的地址为要跳转的函数地址
(3)消息hook机制 利用setwindowshook函数配合全局参数劫持windows下的消息传递,利用callnexthookex将消息进行下一步的分发。通常该技术用来进行dll注入。
(4)SSDT hook在内核层上通过KeServiceDescriptorTable内核导出变量来获取对应的ssdt表地址,接着查询需要hook的内核api的索引,将ssdt表对应索引的函数地址改为需要跳转的函数地址。
5、请尽可能列举你知道的网站未能正确使用图片验证码机制的情况,以及如何绕过其限制?
(1)图形验证码的内容可OCR识别
(2)多阶段的过程,先校验验证码,成功之后的下一步不需要验证码,可以直接抓包,跳过第一步的验证
(3)验证码在服务段校验后,没有立即失效,需要客户端再次请求才会更新,只要客户端不再请求验证码即可使用原来的验证码
(4)生成验证码的模块是否根据提供的参数生成验证码,如果是说明存在漏洞
(5)有些验证码与数据包中的某个参数绑定,比如cookie中的某个属性,只要它们相匹配,验证码就认为是有效的。这种机制存在漏洞。
(6)在某些情况下,验证码隐藏在HTML源码或通过其他方式获得“明文”
(7)在服务器端,是否只有在验证码检验通过后才进行用户名和密码的检验,如果不是说明存在漏洞。
6、请尽可能列举你知道的网站未能安全实现文件上传功能的情况,以及如何绕过其限制?
(1)
●允许直接上传脚本文件:php、jsp、aspx
●结合web server解析漏洞:IIS 5.x/6.0解析漏洞、IIS 6.0解析利用方法有两种:目录解析 /xx.asp/xx.jpg和文件解析abc.asp;.jpg、IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞、Nginx <8.03 空字节代码执行漏洞、Apache解析漏洞
●其他:
A.在windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单.若上传成功,空格和点都会被windows自动消除,这样也可以getshell。
B.如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:
然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件。
(2)绕过方法:
●firebug禁用javascript,firebug修改允许上传类型
●Burp绕过限制
●本地构造html代码
●后端检测-MIME,修改MIME类型;后端检测-文件头,jpg图片;后端检测-文件扩展名,黑名单与白名单、大小写、寻找黑白名单的遗漏点配合解析漏洞来绕过、%00和\x00截断
●文件内容绕过:图片马、加密webshell、填充垃圾数据
7、利用汇编语言编写一道程序,不使用乘法以及除法指令,计算(((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
8、阅读如下代码,其中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
9、CSRF、SSRF和重放攻击有什么区别?
CSRF是跨站请求伪造攻击,由客户端发起
SSRF是服务器端请求伪造,由服务器发起
重放攻击是将截获的数据包进行重放,达到身份认证等目的
10、 mysql的网站注入,5.0以上和5.0以下有什么区别?
5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名。
5.0以下是多用户单操作,5.0以上是多用户多操作。
11、无论是在日常的网络维护,还是在渗透测试过程中,经常会使用到端口转发、代理、隧道技术,请详尽地说明这三种技术的异同点。
端口转发,就是指访问某一IP和端口的流量会被转发到另一个IP和端口,通过中转的方式,来访问无法直接访问到的主机和服务。
代理和隧道本质上都是一种端口转发技术。代理的特点是代理服务端可以根据客户端的数据包,自动判断向哪个目标机器转发;隧道技术主要是对端口转发的流量进行了加密和封装的处理。
12、将下列汇编代码逆成等价的C代码。
func1:
push ebp
mov ebp, esp
sub esp, 14h
push esi
mov eax, 4
imul ecx, eax, 0
mov edx, [ebp+0Ch]
mov eax, [edx+ecx]
mov [ebp-8], eax
mov ecx, 4
shl ecx, 0
mov edx, [ebp+0Ch]
mov eax, [edx+ecx]
mov [ebp-0Ch], eax
mov [ebp-14h], 61C88647h
mov [ebp-4], 0C6EF3720h
mov [ebp-10h], 0
jmp short loc_401369
loc_401360:
mov ecx, [ebp-10h]
add ecx, 1
mov [ebp-10h], ecx
loc_401369:
mov edx, [ebp-10h]
cmp edx, [ebp+8]
jnb short loc_4013D3
mov eax, [ebp-8]
shl eax, 5
mov ecx, [ebp-8]
shr ecx, 4
xor eax, ecx
add eax, [ebp-8]
mov edx, [ebp-4]
shr edx, 0Bh
and edx, 3
mov ecx, [ebp+10h]
mov esi, [ebp-4]
add esi, [ecx+edx*4]
xor eax, esi
mov edx, [ebp-0Ch]
sub edx, eax
mov [ebp-0Ch], edx
mov eax, [ebp-4]
add eax, [ebp-14h]
mov [ebp-4], eax
mov ecx, [ebp-0Ch]
shl ecx, 5
mov edx, [ebp-0Ch]
shr edx, 4
xor ecx, edx
add ecx, [ebp-0Ch]
mov eax, [ebp-4]
and eax, 3
mov edx, [ebp+10h]
mov esi, [ebp-4]
add esi, [edx+eax*4]
xor ecx, esi
mov eax, [ebp-8]
sub eax, ecx
mov [ebp-8], eax
jmp short loc_401360
loc_4013D3:
mov ecx, 4
imul edx, ecx, 0
mov eax, [ebp+0Ch]
mov ecx, [ebp-8]
mov [eax+edx], ecx
mov edx, 4
shl edx, 0
mov eax, [ebp+0Ch]
mov ecx, [ebp-0Ch
mov [eax+edx], ecx
pop esi
mov esp, eb
pop eb
retn
endp
func1(1,2,3)
func1(int a,int b,int c)
{
int var1,var2,var3;
var1 = *b;
var2 = *(b+4);
var3 = 0xC6EF3720;
for (int i =0;i>11)&3))+var3)^(var1+((var1>>4)^(var1<<5)));
var3 +=0x61c88647;
var1-=(*(DWORD*)(c+4*(var3&3))+var3)^(var2+((var2>>4)^(var2<<5)));
}
*(DWORD*)b = var1;
*(DWORD*)(b+4) = var2;
return b;
}
13、以下为汇编码的两个函数func和reverse,分析这两个函数并编写等价的C代码函数
func:
mov ecx, eax
lea edx, [ecx+1]
loop:
mov al, [ecx]
inc ecx
test al, al
jnz loop
sub ecx, edx
mov eax, ecx
ret
reverse:
mov ebp, eax ;eax为输入的参数1
mov edi, edx ;edx为输入的参数2
mov esi, ebx ;ebx为输入的参数3
mov eax, ebp
call func
push eax
xor ebx, ebx
xor ecx, ecx
xor ebp, ebp
jmp label4
label1:
lea eax, [ebp*4]
add eax, edi
mov eax, [eax]
cmp eax, ecx
jbe label2
mov ebx, ecx
mov ecx, eax
jmp label3
label2:
cmp eax, ebx
jbe label3
mov ebx, eax
label3:
inc ebp
label4:
cmp ebp, esi
jb label1
pop eax
add eax, ebx
add eax, ecx
ret
int mystrLen(char *str)
{
char *pstr = str+1;
while( *str++ );
return str - pstr;
}
int reverse(char *str, unsigned int numArr[], unsigned int numLen)
{
int len;
int i;
unsigned int big1,big2;
len = mystrLen(str);
big1 = 0;
big2 = 0;
for (i = 0; i < numLen; i++)
{
if (numArr[i] > big1){
big2 = big1;
big1 = numArr[i];
}
else if (numArr[i] > big2){
big2 = numArr[i];
}
}
return len + big1 + big2;
}
14、请回答如下端口默认对应的服务,以及在渗透测试过程中我们可以从哪些角度考虑其安全问题。端口:21、22、873、1433、3306、6379、11211
端口 | 服务 | 说明 |
21 | FTP | 匿名访问\弱口令 |
22 | SSH | 弱口令 |
873 | rsync | 未授权访问\弱口令 |
1433 | mssql | 弱口令 |
3306 | mysql | 弱口令 |
6379 | redis | 一般无验证,直接访问 |
11211 | memcache | 内存泄露\未授权访问 |
15、登录一个应用程序后,服务器建立以下cookie:
1
|
Set-cookie: sess=abcd1129efgh;
|
单击“退出”按钮后,应用程序执行以下客户端脚本:
1
2
|
document.cookie=”sess=”;
document.location=”/”
|
通过这种行为,可以得出什么结论?
16、简述一下SOCKS协议TCP穿透原理
17、简述一下利用SQL注入漏洞拖取数据的过程
18、用C语言分别编写含有以下漏洞的函数:
(1)通过函数的输入参数可控的缓冲区溢出漏洞的函数,以及对应的修复该漏洞的函数
(2)通过函数的输入参数可控的整数溢出漏洞的函数,以及对应的修复该漏洞的函数
样例:
//含有格式化字符串漏洞函数:
void format_vul(char *outstr){
printf(outstr);
}
//格式化字符串漏洞的修复函数:
void format_vul(char *outstr){
printf("%s", outstr);
}
//缓冲区溢出漏洞函数:
void buffer_vul(char *buf){
char str[20];
strcpy(str, buf);
}
//缓冲区溢出漏洞修复:
void buffer_vul(char *buf){
char str[20];
if (strlen(buf) >= 20)
return;
strcpy(str, buf);
}
//整数溢出漏洞函数:
void int_vul(int idx, int type){
int arr[8];
if (idx >= 8)
return;
arr[idx] = type;
}
//整数溢出漏洞修复:
void int_vul(int idx, int type){
int arr[8];
if (idx >= 8 || idx < 0)
return;
arr[idx] = type;
}
19、谈谈在WEB类安全问题的应急处置过程中web日志溯源攻击路径的思路?
在对WEB日志进行安全分析时,可以按照下面两种思路展开,逐步深入,还原整个攻击过程。
首先确定受到攻击的时间范围,以此为线索,查找这个时间范围内可疑的日志,根据可疑ip、攻击特征等进一步排查(WEB日志会记录客户端对WEB应用的访问请求,这其中包括正常用户的访问请求和攻击者的恶意行为。通过大量的分析,我们发现攻击者在对网站入侵时,向网站发起的请求中会带有特定的攻击特征,如利用WEB扫描器在对网站进行漏洞扫描时往往会产生大量的404错误日志,当有攻击者对网站进行SQL注入漏洞探测时,WEB访问日志中通常会出现and 1=1等字样),最终锁定攻击者,确认攻击的手段,还原攻击过程。参考下图。
20、心脏滴血漏洞产生的原因,危害都有哪些?
Heartbleed漏洞,这项严重缺陷(CVE-2014-0160)的产生是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查。攻击者可以追踪OpenSSL所分配的64KB缓存、将超出必要范围的字节信息复制到缓存当中再返回缓存内容,这样一来受害者的内存内容就会以每次64KB的速度进行泄露。通过读取网络服务器内存,攻击者可以访问敏感数据,从而危及服务器及用户的安全。敏感的安全数据,如服务器的专用主密钥,可使攻击者在服务器和客户端未使用完全正向保密时,通过被动中间人攻击解密当前的或已存储的传输数据,或在通信方使用完全正向保密的情况下,发动主动中间人攻击。攻击者无法控制服务器返回的数据,因为服务器会响应随机的内存块。
漏洞还可能暴露其他用户的敏感请求和响应,包括用户任何形式的POST请求数据,会话cookie和密码,这能使攻击者可以劫持其他用户的服务身份。漏洞让特定版本的openSSL成为无需钥匙即可开启的“废锁”,入侵者每次可以翻检户主的64K信息,只要有足够的耐心和时间,就可以翻检足够多的数据,拼凑出户主的银行密码、私信等敏感数据。
21、Apache,IIS,Nginx的文件解析漏洞都是如何解析和利用的?
(1)Apache解析漏洞。
它是从右到左开始判断解析,如果为不可识别解析,就再往左判断.比如upupimage.php.owf.rar “.owf”和”.rar”?这两种后缀是apache不可识别解析,apache就会把upupimage.php.owf.rar解析成php.
(2)IIS解析漏洞
●IIS5.x/6.0中的/xx.asp/xx.jpg ,网站下建立文件夹的名字为.asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
●123.asp;.jpg会被服务器看成是123.asp,IIS6.0 默认的可执行文件除了asp还包含这三种/upupimage.asa/upupimage.cer /upupimage.cdx
(3)nginx解析漏洞
●nginx默认Fast-CGI开启状况下,黑阔上传一个名字为upupimage.jpg,内容为');?>的文件,然后访问upupimage.jpg/.php,在这个目录下就会生成一句话木马 shell.php。
●Nginx在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码,影响版:0.5.,0.6.,0.7 <= 0.7.65, 0.8 <= 0.8.37
22、从哪些方面可以进行CSRF漏洞防御?
CSRF漏洞防御主要可以从三个层面进行,即服务端的防御、用户端的防御和安全设备的防御。
(1)检测HTTPreferer 字段同域。根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。比如某银行的转账是通过用户访问http://bank.test/test?page=10&userID=101&money=10000页面完成,用户必须先登录bank.test,然后通过点击页面上的按钮来触发转账事件。当用户提交请求时,该转账请求的Referer值就会是转账按钮所在页面的URL(本例中,通常是以bank. test域名开头的地址)。而如果攻击者要对银行网站实施CSRF攻击,他只能在自己的网站构造请求,当用户通过攻击者的网站发送请求到银行时,该请求的Referer是指向攻击者的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank. test开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求
(2)限制sessioncookie的生命周期。CSRF攻击是有条件的,当用户访问恶意链接时,认证的cookie仍然有效,所以当用户关闭页面时要及时清除认证cookie
(3)使用验证码。虽然攻击者已经通过获取cookie得到用户的身份,但是通过在你的表单中包括验证码,事实上网站已经消除了跨站请求伪造攻击的风险。可以在任何需要执行操作的任何表单中使用这个流程。
(4)cookie关键字段设置HttpOnly属性。可以在一定程度防御CSRF。