4种伪静态注入方法讲解

伪静态,主要是为了隐藏传递的参数名,伪静态只是一种URL重写的手段,既然能接受参数输入,所以并不能防止注入。目前来看,防止注入的最有效的方法就是使用LINQ。常规的伪静态页面如下:http://www.XXX.com/play/Diablo.html, 在看到之前先要确定这个页面是静态还是伪静态,鉴别方法很多。
例如关联的动态页面是game.php ,那么当用户访问后程序会自动转换成类似http://www.XXX.com/game.php?action=play& name=Diablo 的形式,当然这部分是PHP执行的所以在访问时看不到。假如name=Diablo这个参数有注入点但是访问的是伪静态页面,那么注入的语句其实差不多,不过如果是MYSQL数据库是不能用注释符的,因 为注释的斜杠会被当成目录访问,那么就会出现问题,所以这里的注入需要把语句补全。
注入点检测可以用:http://www.XXX.com/play/Diablo’ and 1=’1.html与http://www.XXX.com/play/Diablo’ and 1=’2.html来判断,联合查询我也试过,不过失败了。我用的语句如下:http://www.XXX.com/play/diablo’ and 1=2 union select 1,2… from information_schema.columns where 1=’1.html,但是测试了N次都不能成功,有可能程序的SQL语句后面还有其他条件,具体原因没仔细看。
所以这个时候只能用盲注来检测,不过因为伪静态注入的URL比较特殊,一般的注入工具是利用不了的,所以就把刺猬写的COOKIES注入中转器的 get方式注入的代码修改了一下,只要把注入的参数写成Diablo ,然后在提交的语句后面加上.html那么就可以直接放到穿山甲里注入了。
注入的速度就看中转的速度了,感觉用低版本的穿山甲效果更好,高版本有可能因为速度比较快所以在猜解字母的时候会导致部分内容检测不到。为了更好的解释伪静态,先看看四种伪静态的php实现方法:

伪静态方法一:

// localhost/php100/test.php?id|1@action|2
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
echo $Php2Html_FileUrl.”<br>”;// /php100/test.php?id|1@action|2
$Php2Html_UrlString = str_replace(“?”,””,str_replace(“/”, “”, strrchr(strrchr($Php2Html_FileUrl, “/”),”?”)));
echo $Php2Html_UrlString.”<br>”;// id|1@action|2
$Php2Html_UrlQueryStrList = explode(“@”, $Php2Html_UrlString);
print_r($Php2Html_UrlQueryStrList);// Array ( [0] => id|1 [1] => action|2 )
echo “<br>”;
foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr)
{
$Php2Html_TmpArray = explode(“|”, $Php2Html_UrlQueryStr);
print_r($Php2Html_TmpArray);// Array ( [0] => id [1] => 1 ) ; Array ( [0] => action [1] => 2 )
echo “<br>”;
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
//echo ‘假静态:$_GET变量<br />’;
print_r($_GET); // Array ( [id|1@action|2] => [id] => 1 [action] => 2 )
echo “<br>”;
echo “<hr>”;
echo $_GET[id].”<br>”;// 1
echo $_GET[action];// 2
?>
伪静态方法二:
// localhost/php100/test.php/1/2
$filename = basename($_SERVER[''SCRIPT_NAME'']);
echo $_SERVER[''SCRIPT_NAME''].”<br>”;// /php100/test.php
echo $filename.”<br>”;// test.php
if(strtolower($filename)==’test.php’){
if(!empty($_GET[id])){
$id=intval($_GET[id]);
echo $id.”<br>”;
$action=intval($_GET[action]);
echo $action.”<br>”;
}else{
$nav=$_SERVER[''REQUEST_URI''];
echo “1:”.$nav.”<br>”;// /php100/test.php/1/2
$script=$_SERVER[''SCRIPT_NAME''];
echo “2:”.$script.”<br>”;// /php100/test.php
$nav=ereg_replace(“^$script”,””,urldecode($nav));
echo $nav.”<br>”; // /1/2
$vars=explode(“/”,$nav);
print_r($vars);// Array ( [0] => [1] => 1 [2] => 2 )
echo “<br>”;
$id=intval($vars[1]);
$action=intval($vars[2]);
}
echo $id.’&’.$action;
}
?>

伪静态方法三:

function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
echo $nav.”<br>”;
$script_name=$_SERVER["SCRIPT_NAME"];
echo $script_name.”<br>”;
$nav=substr(ereg_replace(“^$script_name”,””,urldecode($nav)),1);
echo $nav.”<br>”;
$nav=preg_replace(“/^.ht(m){1}(l){0,1}$/”,””,$nav);//这句是去掉尾部的.html或.htm
echo $nav.”<br>”;
$vars = explode(“/”,$nav);
print_r($vars);
echo “<br>”;
for($i=0;$i<Count($vars);$i+=2){
$_GET["$vars[$i]“]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$year=$_GET["year"];//结果为’2006′
echo $year.”<br>”;
$action=$_GET["action"];//结果为’_add’
echo $action;
?>

伪静态方法四:

//利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分
if(@$path_info =$_SERVER["PATH_INFO"]){
//正则匹配一下参数
if(preg_match(“/\/(\d+),(\d+),(\d+)\.html/si”,$path_info,$arr_path)){
$gid =intval($arr_path[1]); //取得值 1
$sid =intval($arr_path[2]); //取得值100
$softid =intval($arr_path[3]); //取得值8630
}else dIE(“Path:Error!”);
//相当于soft.php?gid=1&sid=100&softid=8630
}else dIE(‘Path:Nothing!’);
?>
代码

PHP防注入,主要是为了防止恶意写入后台数据库
//防注入函数
function inject_check($sql_str){
$check=eregi(‘select|insert|update|delete|\’|\/\*|\*|\.\.\/|\.\/|union|into|load_file
|outfile’, $sql_str);
if($check){
echo ” 输入非法内容”;
exit();
}else{
return $sql_str;
}
}
//接收传递参数后进行转换

$_GET[type]=inject_check($_GET[type]);
//之后再使用转换后的参数
之前写的这篇关于伪静态注入的文章,写的比较简单基本上只算是对伪静态注入的方法和原理做了简单介绍,很多细节方面的东西都没有提到,不过要纠正一点,伪 静态注入一样可以用联合查询的,只是具体的字段数要一个一个猜,这个有点麻烦,今年主要在看老美的网站,发现很多伪静态站点都有注入点,只是大部分注入点 都比较隐蔽所以在渗透的时候需要花费很多时间,这里就以美国某游戏站点的渗透作为实例,介绍一下整个渗透利用过程。
前段时间比较无聊,上了某游戏站点放松,发现那个站做的很不错而且在线人数达到1W多,因为我是在白天访问的当时美国应该是晚上,所以可以看出这个 站的流量非常大,去alexa上查了一下排名在4千左右,流量25W,那么这个站流量估计有50W+,看了口水都留下来了!!!随即打算检测一下这个网站 的安全性,访问了整个网站只有2个页面是调用PHP的,但是没有注入点,整个网站大致信息如下:APACHE、PHP、数据库未知(应该是MYSQL 吧)、伪静态页面(检查后发现的)、后台找不到、不能破解目录(访问不存在的页面或目录后会返回首页,状态码始终是200和301,扫描的时候会有很多误 报)、可以注册(没有注入点)、不能上传文件、没有常见的配置漏洞(比如目录浏览之类的)、没有扫到冗余文件、没有FTP、没有SSH、端口扫描后也没有 发现。似乎这个网站很棘手,毕竟别人也是排名4K内的站啊!!!在GG、baidu上搜了一下PHP以及敏感的页面也没新发现,其实有时候用百度搜国外站 的收录页会有惊喜哦!因为这个站是伪静态的,所以对主要的几个页面做了伪静态的注入测试,但是都没漏洞,也不知道这个网站是用什么模版做的。用旁注工具扫 了一下域名,发现服务器上绑定了十几个站,悲剧的是所有站用的是同一个网站模版,所有情况和主站一样。估计到这里很多人都想到C段吧,可惜老外的IDC比 较怪,一般不会把一个C放在一个交换机环境里,我碰到最BT的是把子网掩码设为255.255.255.252,稍微好点的是 255.255.255.244,就算弄到同网段的,一般都是LINUX服务器,提权超难,公布的0day基本都不行,所以C段直接放弃。
关注入点继续回到网站上,注册了一个账号,看了一下用户功能,基本上只有修改自己信息的权限,COOKIES方面测试了一下没漏洞,不过发现网站管理 员的账号和注册人员是同一个表的,把URL里的ID改一下就能获得用户名,可惜只有用户名,而且用户名还很BT,哎!!!!难啃的骨头,继续深入~~~~ 看到游戏页面后找到一个投票的连接,抓包后发现也是伪静态(连接类型如下:http://www.XXXXX.com/vote/5453/1), 通过伪静态的注入点检测确定存在注入漏洞并且提交后会执行update语句,检测时提交以下语句(http://www.XXXXX.com/vote /5453′/1 报错,http://www.XXXXX.com/vote/5453-0/1 返回正常游戏名字 http://www.XXXXX.com/vote/5453-1/1 返回5452的游戏名字,判断存在注入点)连接的表是member,可惜显示的出错语句很复杂,各种符号都有,想了几种办法也都没补全,而且数据库中的表 和列也都不知道,似乎只有看源码后才能构造注入语句,鸡肋的注入点,余下来看完了整个网站也只发现一个暴物理路径的漏洞,又是鸡肋!似乎初步的检查到这步 已经完成了,一个字,难!
因为弄到很晚所以睡觉了,隔了几天还是时不时的上来看看网站、看看管理员在线状态,一个星期后觉得很不爽,再次打开这个网站,然后把注册页面、登陆 页面、提交页面作为关键字去网上找相同模版,这次终于有发现了,找到一个新部署的网站,而且后台路径是admin管理员账户是默认的admin,进去后发 现后台可以直接拿SHELL,然后去网上查了一下这个网站的0day,但是比较老所以无法利用,看了一下源码也只发现那个鸡肋的注入点,这个时候忽然想到 了什么,通过上传的SHELL查看数据库的表结构,原来member的表中有一个管理员的选项,设为1就是普通用户,设为2就是管理员,这样就能通过那个 注入点提升权限了,而且在php页面中看到了投票的SQL语句,在构造之后直接在游戏站上测试(语句如下:http://www.XXXXX.com /vote/5453;}’,xxx=’xxx’,xxx=’{xxxx/1), 成功提升为管理员(经过验证发现只要用这个网站模版都可以提权,又一个0day!),而且发现只要账户具有管理权限,前台页面中会以黄色显示用户名,狂喜 之下登陆游戏站,发现在用户界面中多了一个管理员登录的选项,可是!!!悲剧再次发生,连接的目录是默认路径,后台找不到,是在不甘心用平时用的后台扫描 字典,以及自己生成了1-5位的数字以及字符的字典放到havij里爆破,因为havij可以DIY状态代码,所以我把200和301的状态去掉了,扫了 3天后无果!!!!纠结!!!!

在1个星期之后的某天再次打开这个网站,用一个网上下的字典再次扫了整个目录,这次发现在根目录里有一个server-status,访问之后狂 喜,里面有APACHE提供当前服务的URL,所以用户访问的页面都能检查,然后找了website watch进行监控,设置了一些关键字后以平均每3秒钟对该页面检测一次,如果发现有关键字就以MAIL方式报警,同时把有关键字的页面覆盖在邮件中,2 天后成功抓到后台页面,打开后发现是401验证,网站没有下载和FL漏洞,用获取的管理员信息尝试登陆,结果统统失败,感觉脑子都充血了!!!!对了,不 是还有UPDATE权限的鸡肋注入点吗!!由于MYSQL的关系,无法把同表中的内容更新到同表的其他列中,所以第一次失败了,上网查了一下重新构造语句 成功,拿到的是管理员md5的密码,上CMD5上查到源码,然后用管理员的账户通过了401验证,成功登陆后台,进去后随便逛了一下上传 webshell,反弹cmdshell,发现是X64的系统,用了网上找的道的所有EXP都不能提权,不过发现服务器上有2个外网IP,另外一个IP可 以链接FTP和SSH,用了管理员的密码以及passwd里的用户名登陆结果发现网管用了公钥验证,RSA加密,直接访问存放public key的目录显示DENY,直接下载公钥还是DENY,不过可以看所有网站目录。
到这步基本上网上入侵成功了,可是还没提权,不过把管理员的用户名放到GG上搜了一下发现到处都有他的”足迹”,而且都不能用他的密码登陆,只能社 工和跟踪了,看来又是一个漫长的提权过程,整个网站入侵从开始到拿到权限大致用了2个月时间,等有时间了就想办法提权,谢了稍微多了一点,其实伪静态注入 的利用价值还是很高的,而且结合其他鸡肋的安全问题可以直接威胁到网站甚至服务器的安全,相比之下国内站台烂了,即时LINUX有了WEBSHELL 80%都可以提权,用public key做SSH验证的基本没见过,大概这就是差距吧,先写到这里吧,等有时间了写一个完整的关于伪静态注入和检查方法!!!提权内容待续(如果能成功提权的话!)
ps:不错的文章,亮点颇多,很久没看到渗透测试的好文章了,从手法来看,作者的经验与思路达到一定水平。文章中的几个工具也挺实用,我找到的下载地址:
http://www.crsky.com/soft/8573.html WebSite-Watcher v4.41 授权汉化版
http://itsecteam.com/fa/projects/project1.htm Havij v1.1
WebSite-Watcher可以用的地方应该挺多的,暂时只想到在一般情况可用来监视http站的密码记录文件,比如xss或者sniffer的密码记录文件,还有长期监视网站目录文件结构变化,可定义一些关键字,看看有没有新机会。
Havij是个具有sql注入、web结构扫描功能的工具,有些站点访问不存在的页面就会转到(302)自定义错误页面,会导致很多扫描器会误报。它这个可以自定义http请求返回状态码以及文件后缀。

Visual C#泛型学习之泛型

什么是泛型

  一种类型占位符,或称之为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显好处是??类型安全和减少装箱、拆箱。

  类型安全和装箱、拆箱

  作为一种类型参数,泛型很容易给我们带来类型安全。而在以前,在.net1.1中我们要实现类型安全可以这样做 :

//假设你有一个人员集合

public class Person{
 private string _name;
 public string Name
 { get { return _name; }
 set { _name = value;}}
}

//假设你有一个人员集合

public class PersonCollection : IList
{
 ...
 private ArrayList _Persons = new ArrayList();
 public Person this[int index]
 { get { return (Person)_Persons[index]; } }

 public int Add(Person item)
 { _Persons.Add(item);
  return _Persons.Count - 1;}

 public void Remove(Person item)
 { _Persons.Remove(item); }

 object IList.this[int index]
 { get { return _Persons[index]; }
 set { _Persons[index] = (Person)value; }}

 int IList.Add(object item)
 { return Add((Person)item); }

 void IList.Remove(object item)
 { Remove((Person)item); }
  ...
}
上述代码主要采用了显性接口成员(explicit interface member implementation)技术,能够实现类型安全,但问题是:

  产生重复代码。假设你还有一个Dog类集合,其功能相同,但为了类型安全,你必须要Copy一份代码,这样便使程序重复代码增加,当面对变化的时候,更难维护。

public class DogCollection : IList
{
 ...
 private ArrayList _Dogs = new ArrayList();
 public Dog this[int index]
 { get { return (Dog)_Dogs[index]; } }

 public int Add(Dog item)
 { _Dogs.Add(item);
  return _Dogs.Count - 1;}

 public void Remove(Dog item)
 { _Dogs.Remove(item); }

 object IList.this[int index]
 { get { return _Dogs[index]; }
 set { _Dogs[index] = (Dog)value; }}

 int IList.Add(object item)
 { return Add((Dog)item); }

 void IList.Remove(object item)
 { Remove((Dog)item); }
  ...
}
如果在泛型中,要实现类型安全,你不需要拷贝任何代码,你仅仅需要这样做:

List<Person> persons = new List<Person>();
persons.Add(new Person());
Person person = persons[0];
List<Dog> dogs = new List<Dog>();
dogs.Add(new Dog());
Dog dog = dogs[0];
对于值类型的对象还是需要额外的装箱、拆箱。其实对于传统的集合来说,只要其中的包含的内容涉及到值类型,就不可避免需要装箱、拆箱。请看下面的例子。

public class IntCollection : IList
{
 ...
 private ArrayList _Ints = new ArrayList();
 public int this[int index]
 { get { return (int)_Ints[index]; } }

 public int Add(int item)
 { _Ints.Add(item);
  return _Ints.Count - 1;}

 public void Remove(int item)
 { _Ints.Remove(item); }
  object IList.this[int index]
  { get { return _Ints[index]; }
  set { _Ints[index] = (int)value; }}

 int IList.Add(object item)
 { return Add((int)item); }

 void IList.Remove(object item)
 { Remove((int)item); }
  ...
 }

 static void Main(string[] args)
 { IntCollection ints = new IntCollection(); 
  ints.Add(5); //装箱 
  int i = ints[0]; //拆箱
 }
  少量装箱、拆箱对性能的影响不大,但是如果集合的数据量非常大,对性能还是有一定影响的。泛型能够避免对值类型的装箱、拆箱操作,您可以通过分析编译后的IL得到印证。
static void Main()

{
 List<int> ints = new List<int>();
 ints.Add(5); //不用装箱
 int i = ints[0]; //不用拆箱
}
泛型的实现

  泛型方法

static void Swap<T>(ref T a, ref T b)
{ Console.WriteLine("You sent the Swap() method a {0}",
 typeof(T));
 T temp;
 temp = a;
 a = b;
 b = temp;
}
泛型类、结构

public class Point<T>
{
 private T _x;
 private T _y;
 public T X
 { get { return _x; }
  set { _x = value; }}

 public T Y
 { get { return _y; }
  set { _y = value; }}

 public override string ToString()
 { return string.Format("[{0}, {1}]", _x, _y); }
}
泛型的Where
泛型的Where能够对类型参数作出限定。有以下几种方式。

  where T : struct 限制类型参数T必须继承自System.ValueType。
  
  where T : class 限制类型参数T必须是引用类型,也就是不能继承自System.ValueType。

  where T : new() 限制类型参数T必须有一个缺省的构造函数

  where T : NameOfClass 限制类型参数T必须继承自某个类或实现某个接口。

  以上这些限定可以组合使用,比如: public class Point<T> where T : class, IComparable, new()

  泛型的机制

  机制:

  C#泛型代码在被编译为IL代码和无数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以"on-demand"的方式,发生在JIT编译时。

  编译机制:

  1. 第一轮编译时,编译器只为Stack<T>(栈算法)类型产生“泛型版”的IL代码与元数据-----并不进行泛型类型的实例化,T在中间只充当占位符

  2. JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int替换“泛型版”IL代码与元数据中的T---进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。

  泛型的一些问题

  不支持操作符重载。我只知道这么多了

  范型的意义

  泛型的意义何在?类型安全和减少装箱、拆箱并不是泛型的意义,而是泛型带来的两个好处而已(或许在.net泛型中,这是最明显的好处了)。泛型的意义在于??把类型作为参数,它实现了代码之间的很好的横向联系,我们知道继承为代码提供了一种从上往下的纵向联系,但泛型提供了方便的横向联系(从某种程度上说,它和AOP在思想上有相通之处)。在PersonCollection例子中,我们知道Add()方法和Remove()方法的参数类型相同,但我们明确无法告诉我们的程序这一点,泛型提供了一种机制,让程序知道这些。道理虽然简单,但这样的机制或许能给我们的程序带来一些深远的变化吧。

C#开发网页源码读取工具

使用C#的IDE,建一个C#winfrom项目,我建好了,现在要设计主窗体。
点击查看原图

用到的控件有:

1.TextBox 2. richTextBox 3.button 4.Lable


窗体设计就这样,接下来,就是几行代码的事了。

 双击button控件也是直接进入他的Click事件的代码块。

 

双击button控件也是直接进入他的Click事件的代码块。

 

所有代码:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;

namespace Text1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WebClient Web = new WebClient(); //首先生成一个WebClient实例。
            Web.Headers.Add("user-agent","Mozilla/4.0 (compatible;MSIE6.0;Windows NT 5.2;.NET CLR 1.0.3705;)");  //这里是设置HTTP头域信息的。就这个了。
            Stream stream = Web.OpenRead(textBox1.Text.Trim());
            StreamReader SR = new StreamReader(stream,Encoding.UTF8);  //这里不难看懂,设置字符编码的。 ...
            string o = SR.ReadToEnd();  //声明一个变量,接受返回的数据
            richTextBox1.Text = o;        //把变量o的字符串传到richTextBox控件里去。 

        }

    }
}
--------------------------------------------
运行后一系列操作:
点击查看原图
输入谷歌的网址。
点击查看原图
结果.

黑客考虑发射通讯卫星对抗全球互联网监管

北京时间1月2日消息,美国著名IT杂志《PCWorld》网络版近日刊登文章称,网络黑客团体计划发射自己的通讯卫星到地球制定轨道,然后再在地面布置卫星信号接收站来实现彼此追踪和通讯功能。黑客此举意在对抗全球日益严格的互联网监管制度。

根据英国BBC新闻的报道,在柏林举行的Chaos Communication Congress大会上,一些黑客提出计划,通过发射自己的卫星使黑客之间实现有效通讯,从而绕开政府监管。这一网络建设计划名为“黑客空间全球网络”(Hackerspace Global Grid)。该计划还包括建设地面站点,跟踪卫星并与卫星通信。从长远来看,黑客还计划实现载人登月。

黑客活动家尼克-法尔(Nick Farr)表示,人们可能不想让黑客之间实现更好的通讯,然而我们关注的却是这一宏伟计划能否得以实现的途径。该计划还包括研发能够在空间生存的新电子设备以及能够将这些设备运载到太空的运输工具。

法尔及其同伴正在与德国一家名为Constellation的太空研究机构一起建设“黑客空间全球网络”项目。根据英国媒体的报道,一些业余爱好者已经发射了小型卫星,但追踪这些卫星对于缺乏预算的组织来说很困难。

黑客组织最初于去年8月呼吁用户支持这些项目,而政府对互联网监管的加强刺激了这一项目的发展。

法尔表示:“最初的目标是在太空中建设不受监管的互联网络。让我们将互联网摆脱陆地上国家政府的控制。”他指出,美国的《网络反盗版法案》(Stop Online Piracy Act,SOPA)是威胁互联网自由的一个典型例子。如果这一法案获得通过,那么许多网站将由于涉嫌侵犯版权而被封杀。