存档

‘编程地带’ 分类的存档

php防注入

2011年3月25日 1 条评论

翻某程序时看到这样写,记录下来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function prepare_query($sql, $params=null)
{
	$sql_block	= explode("?", $sql);
	$sp_size	= sizeof($sql_block) - 1;
	$param_size	= sizeof($params);
 
	if ( $sp_size == 0 && $params == null)
		return $sql;
 
	if ( ($sp_size < 1) || ($param_size < 1) || ($sp_size != $param_size) )
		return "";
 
	if ($param_size == 1)
	{
		if ( gettype($params) == 'string')
		{
			$result = str_replace('?', "'".$params."'", $sql);
		}
		else if ( gettype($params) == 'integer')
		{
			$result = str_replace('?', $params, $sql);
		}
	}
	else if ($param_size > 1)
	{
		for ($i = 0; $i < sizeof($params); $i++)
		{
			if ( gettype($params[$i]) == 'string')
				$sql_block[$i] .= "'".$params[$i]."'";
			else if ( gettype($params[$i]) == 'integer')
				$sql_block[$i] .= $params[$i];
		}
 
		$result = "";
		for ($i = 0; $i < $param_size; $i++)
		{
			$result .= $sql_block[$i];
		}
	}
 
	return $result;
}

uchome发送邮件小BUG

2009年10月6日 2 条评论

  uchome中的发送邮件函数中,第一次没有进行清空缓冲区,造成发送第一封邮件会造成把页面所有数据发送出去,在 source/function_sendmail.php 文件的 16-18 行:

  include template(&#039;sendmail&#039;);<br />  $message = ob_get_contents();<br />  obclean();

包含sendmail模版,读取缓冲区数据保存在 $message 变量中,然后清除。其实在include template('sendmail');之前,缓冲区里面应该有其他数据,这样就加在了一起保存在邮件内容中进行发送。
解决方法就是先清空一次缓冲区:

obclean();<br />  include template(&#039;sendmail&#039;);<br />  $message = ob_get_contents();<br />  obclean();

这样读取的话,就是完整的 sendmail 模版数据。
ps: 一开始搞了好久,没找到原因之前,我先向一个垃圾email里面发送一次,其后再向真正的目标邮件发送。比如:

 //容错处理<br />  //sendmail("xxx@163.com",$subject, $mail_message);  <br />  //发送<br />  if(!sendmail("recv_mail@gmail.com",$subject, $mail_message)) {<br />    ErrView("·发送邮件错误!",0);<br />  }

可能是我修改模版太多?

分类: 编程地带 标签:

javascript htmlspecialchars

2009年9月25日 6 条评论

记录:

<script>
   function htmlspecialchars(string){
     var data = [];
     for(var i = 0 ;i <string.length;i++) {
       data.push( "&#"+string.charCodeAt(i)+";");
     }
  return data.join("");
   }
   document.write(htmlspecialchars("@{}<script>javascript alert<\/script>"));
</script>
<script>
function filter (str) {
  str = str.replace(/&/g, '&amp;');
  str = str.replace(/</g, '&lt;');
  str = str.replace(/>/g, '&gt;');
  str = str.replace(/'/g, '&acute;');
  str = str.replace(/"/g, '&quot;');
  str = str.replace(/\|/g, '&brvbar;');
  return str;
}
alert(filter("url"))
</script>
分类: 编程地带 标签: ,

jvascript字节流加密

2009年8月5日 1 条评论

我们先看如下加密函数:

function dehydrate(s) {<br />  var r = new Array();<br />  for (var i=0; i < s.length ; i++)<br />  {<br />    for (var j=6; j >= 0 ; j-- )<br />    {<br />      if (s.charCodeAt(i) & (Math.pow(2,j)) )<br />      {<br />        r.push(&#039; &#039;);<br />      } else {<br />        r.push(&#039;&#92;t&#039;);<br />      }<br />    }<br />  }<br />  r.push(&#039;&#92;n&#039;);<br />  return r.join(&#039;&#039;);<br />}

将一个包含任意字符的字符串转换为一个只包含空白字符的字符串,而这些空白字符实际上表示了原字符串中对应字符的字节流。一个空格表示1,一个制表符(Tab)表示0,而换行符则表示字节流的结束。例如:a = 空格 空格 制表 制表 制表 制表 空格开头 = 110001 = 97 .我们对一段网马进行加密后变成如下代码:

//startevil<br />                        <br />                    <br />//endevil

请注意,注释的中间关非空白,而是加密后的代码。我们将其代码放入网页中,然后使用解密函数进行解密: 阅读全文…

Firefox和IE中javascript变量的不同

2009年3月19日 3 条评论

将以下代码保存html,放在Firefox访问:

<script>var location='' </script>

正题:
上面的脚本是不是造成页面一直刷新,而放在IE中却无事。那么好,我建立如下html:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>1111111</title>
<script>
var location='http://microsoft.com'
</script>
</head>
<body>
<iframe src="2.html" name="searchframe" id="searchframe" >
</body>
</html>

在Firefox 下访问,页面会跳转到 http://microsoft.com。
在IE 下访问,就会包含我的2.html,显示出来,不会跳转。
根据DHTML手册中说:
location 对象的默认属性就是 location.href。例如,设置 location=’http://microsoft.com’ 的结果就等于设置 location.href=’http://microsoft.com’。

当设置此列出的任何属性后,浏览器都将立即前往指定 URL。

此例脚本中,我们只是定义了一个 location 变量,将其赋值,而FF不单将他赋值了,而且还将他执行了,这仅仅是一个变量。但是因为我们定义的变量名字特殊,不太符合变量的要求,不应该将“关键字” 定义成变量名。而对于 IE 来说,他却没有执行,只做了一个简单的赋值操作。
有些时候必须注意这些,就像今天,有人将其赋值为空,他觉得是初始化,但是这样,在FF中执行,就会成为一个“死循环”!

分类: 编程地带 标签:

简单判断机器所安装软件

2009年3月19日 3 条评论

  一种方法,但是效果不佳!
  

<img src="res://c:&#92;Program Files&#92;360&#92;360se&#92;360SE.exe/AB.GIF" onerror=alert(&#039;没有安装360浏览器&#039;) />

  大家都知道,在一个程序里面,会包含一些资源,如果里面有图片资源的话,我们就可以弄一个图片,src本地程序里面的资源,如果onerror,就说明没有安装,但是如果程序有可能在D盘,E盘或者其他路径安装,这样就不行了,必须默认路径才。如果程序开发者无论程序装在哪一个盘,都会向一个固定本地目录释放一张图片,用于判断多好!当然了,还是判断 http头部最好了,简单有效。
测试一下360浏览器: 阅读全文…

分类: 编程地带 标签:

php_xss_filter_function.php

2009年3月17日 1 条评论
<?PHP
function RemoveXSS($val) {
   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
   // this prevents some character re-spacing such as <java\0script>
   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
   $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);
 
   // straight replacements, the user should never need these since they're normal characters
   // this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A &#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
   $search = 'abcdefghijklmnopqrstuvwxyz';
   $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   $search .= '1234567890!@#$%^&*()';
   $search .= '~`";:?+/={}[]-_|\'\\';
   for ($i = 0; $i < strlen($search); $i++) {
      // ;? matches the ;, which is optional
      // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
 
      // &#x0040 @ search for the hex values
      $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
      // &#00064 @ 0{0,7} matches '0' zero to seven times
      $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
   }
 
   // now the only remaining whitespace attacks are \t, \n, and \r
   $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
   $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
   $ra = array_merge($ra1, $ra2);
 
   $found = true; // keep replacing as long as the previous round replaced something
   while ($found == true) {
      $val_before = $val;
      for ($i = 0; $i < sizeof($ra); $i++) {
         $pattern = '/';
         for ($j = 0; $j < strlen($ra[$i]); $j++) {
            if ($j > 0) {
               $pattern .= '(';
               $pattern .= '(&#[xX]0{0,8}([9ab]);)';
               $pattern .= '|';
               $pattern .= '|(&#0{0,8}([9|10|13]);)';
               $pattern .= ')*';
            }
            $pattern .= $ra[$i][$j];
         }
         $pattern .= '/i';
         $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag
         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
         if ($val_before == $val) {
            // no replacements were made, so exit the loop
            $found = false;
         }
      }
   }
   return $val;
}
?>
分类: 编程地带 标签: ,

提取网页内的mp3地址

2009年2月11日 3 条评论

  有些网页对真实的mp3地址进行了防盗链处理,造成无法直接查看源文件来获取真实的物理地址。有时他会将地址保存在%USERPROFILE%\Administrator\Local Settings\Temporary Internet Files 目录下面为html文件,其中就包含了其真实的地址,有时在一个网页内有多个mp3地址,也就会有多个html文件,如果手工一个一个处理相当麻烦,下面用 bat+vbs 来提取,其实用findstr也可以。更简单!
bat code:

<br />@echo off<br />REM code by woyigui<br />REM dir命令后的htm文件随意修改<br />for /f "tokens=*" %%i in (&#039;dir /s /b ^"C:&#92;Documents and Settings&#92;Administrator&#92;Local Settings&#92;Temporary Internet Files&#92;MusicUrl*.htm^"&#039;) do type "%%i" >> d:&#92;mp3plist.txt && echo. >>d:&#92;mp3plist.txt<br />cscript mp3-url.vbs d:&#92;mp3plist.txt

vbs code: 阅读全文…

分类: 编程地带 标签: ,

使用通用防注入的问题

2008年12月12日 没有评论

通用防注入一般都是包含中conn.asp文件内,或者单个文件内,加include,但是neeao版的在模块当中,定义了一个非常常用变量sql, 该变量在很多时候都会用到,所以会引起重定义错误,如:

Microsoft VBScript 编译器错误 错误 &#039;800a0411&#039; <br />名称重定义 <br />/Customers_New.asp,行 58 <br />dim rs,sql,tdCount,precent<br />-------^

快速解决方法就是,将通用防注入内的常见变量全部改掉,改成非常复杂的变量。

分类: 编程地带 标签:

VC6 SP6补定下载地址

2008年12月10日 2 条评论

解决VC6在编译的时候,linking…..,一直就这样link下去的BUG。
解决vc6卡死的办法就是打上官方的原版VC6sp6补丁|VS6sp6补丁。下载地址如下:请看清你需要的是中文还是英文
英文版地址:
http://download.microsoft.com/download/1/9/f/19fe4660-5792-4683-99e0-8d48c22eed74/Vs6sp6.exe
简体中文版地址:
http://download.microsoft.com/download/e/c/9/ec94a5d4-d0cf-4484-8b7a-21802f497309/Vs6sp6.exe

分类: 编程地带 标签: