谈一谈注入工具的原理和开发
作者:CC 来源:hackbase 添加时间:2006-5-26 13:08:48POST /huace/add.php HTTP/1.1
Host: 202.147.125.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 115
name=test&email=&comefrom=&homepage=&icq=&oicq=&image=say.gif&comment=test&password=&doadd=%B7%A2%CB%CD%C1%F4%D1%D4
上面的Content-Type字段表示为POST表单型的,Content-Length当然就是表示实体数据的长度了,这里都不能少,不然就无法正确接收了。这样,服务器端处理页面就会收到提交的数据,并接收处理。
上面不知不觉的讲了一大堆关于客户端的东西,接下来看服务器方面。当报文数据到达服务器后,服务器底层进程进行接收并放入特定的缓冲区,同时设置一些环境变量,如“CONTENT_LENGTH“、”QUERY_STRING“等,当然这其间还是屏蔽了一些底层细节的,如客户端提交的数据是怎么被重置到被请求页的标准输入的,在此我们就不做过多的考虑。之后高层应用程序如CGI、ASP、PHP等对其进行数据提取,其中CGI还须自己进行Unencode解码和字符串提取。假如向一个ASP程序提交数据,我提交了name和body字段,且采用POST表单方式提交,在ASP程序中应如下进行接收:
name=request.form("name")
body=request.form("body")
并添加到数据库中
rs.addnew
rs("name")=name
rs("body")=body
rs.update
到此,该讲的也基本上讲完了,同时这里我们还要注意一点就是我们在发送报文时,“name=value“URLEncode编码这个东西不能少,如果没有它,我们在向数据库写东西的时候有可能就会失败。同时我们在这里还要注意一个问题,当编译器处理的是中文字符时,它会自动根据字符的位7来读入一个或两个字符,这时可以强制采用unsigned char *来读入一个字符。
int isT(char ch) { if(ch==’ ’||ch==’%’||ch==’/’||ch&0x80) return 1; else return 0; } int encode(char *s,char *d) { if(!s||!d) return 0; for(;*s!=0;s++) { unsigned char *p=(unsigned char*)s; if(*p==’ ’) { *d=’%’; *(d+1)=’2’; *(d+2)=’0’; d+=3; } else if(isT(*p)) { char a[3]; *d=’%’; sprintf(a,"%02x",*p); *(d+1)=a[0]; *(d+2)=a[1]; d+=3; } else { *d=*p; d++; } } *d=0; return 1; } |
int unencode(char *s,char *d) { if(!s||!d) return 0; for(;*s!=0;s++) { if(*s==’+’) { *d=’ ’; d++; } else if(*s==’%’) { int code; if(sscanf(s+1,"%02x",&code)!=1) code=’?’; *d=code; s+=2; d++; } else { *d=*s; d++; } } *d=0; return 1; } |
(e129)