说在前面

本来只想复现一下sql注入的几篇文章,但在先知上找到了几篇非常好的入门审计的文章。于是打算按照他的审计思路,熟悉一下PHP代码审计流程,同时整理一下SQL注入的审计方法。

文章地址:https://xz.aliyun.com/t/3532

过程一 了解网站的基本架构

文章是拿PbootCMS1.2.1来做演示。 安装好系统,配置好数据库信息,阅读一下网站开发手册。

在审计之前,可以先做以下事情:

1. 了解网站目录结构
使用 tree > tree.txt 来生成文件树。快速了解系统。

2. 确定路由走向
一般是mvc的路由,这个cms还包含自定义路由。

过程二 了解系统参数与底层过滤情况

1.    了解系统参数过滤的情况
    a)原生GET,POST,REUQEST最简单的方法就是找一个系统中外部可访问的方法,使用
    var_dump($_GET);
    var_dump($_POST);
    var_dump($_REQUEST);
    来查看过滤情况

    文章使用了一个留言新增点,添加了上方语句之后。
    访问:/index.php/Message/add?test='";!-=$%^{()}<>
    用此来检测原始数据的过滤情况

    b)系统外部变量获取函数 get(),post(),request()
    可以直接使用seay搜索"get("来寻找到get数据处理的函数。

2.    了解数据库底层运行方式
    了解数据库增删查改的函数,查看是否有过滤。
    seay搜索:insert( 等。
Weiterlesen »

说在前面

第一次打强网杯,没想到这么难,萌新瑟瑟发抖。BY Threezh1

题目有点绕,看了半天都没找到重点。后面还是靠学长给的payload思路理清楚了过程。这里就记录一下,学习学习。

题目分析

网站基本功能:

注册登录后,可以上传一张图片作为头像。

无论上传什么格式的文件,文件名都会修改为md5值.png

分析:

使用dirsearch等工具可以直接扫到网站源码地址:

http://49.4.6.176:32288/www.tar.gz

框架为TP5,直接看application/web/controller目录。包括了以下几个模块,分别对应了网站的几个功能。由于Login.php里没有对解题有用的信息,我们就只看其他三个页面。

Index.php         //账户首页
Login.php         //登陆
Profile.php     //上传
Register.php     //注册
Weiterlesen »

重装漏洞

根据大佬们的总结,重装漏洞可以以下几种类型:

  1. 自动删除这个安装文件

    通过生成一个lock文件来判断程序是否安装过

  2. 根本无验证

    安装完成后不会自动删除文件,又不会生成lock判断是否安装过

  3. 安装file

    直接用GET提交step绕过,直接进入下一步

  4. 变量覆盖导致重装

    可以GET,POST,COOKIE 任意提交一个变量名$insLockfile,给其赋空值,覆盖掉$insLockfile,从而让file_exists为false就不会退出

  5. 判断lock后,无exit

    判断是否存在lock文件,如果存在lock文件,就会header到index.php,但是header后并没有exit,所以 并不会退出,类似的还有javascript弹个框

  6. 解析漏洞

    在安装完成后会将install.php 重命名为index.php.bak,但是由于Apache的解析漏洞:如果无法识别到最后一个后缀的话,就会向上解析,那么就又变成了php了,然后结合安装时的变量覆盖又成重装了。

  7. 满足一些条件不会退出的

这次复现的两个漏洞,都属于第五类。当页面跳转到主页之后,原来的php进程依然存在,导致可以重装,而当配置信息没有经过过滤而被直接写入了文件当中,就可能会导致getshell。寻找此类漏洞应该尝试去跟踪配置信息的最终去处,并检查是否有过滤。通过构造闭合语句利用漏洞。

Weiterlesen »

说在前面

这一段时间遇到两次JWT的CTF题,本想好好整理一下,结果搜到一篇文章把我想整理的全写出来了。

文章地址:https://www.anquanke.com/post/id/145540

所以这里就只作为一个备忘录,简单总结一下。

JWT (JSON Web Token)

最常用的网址:https://jwt.io/

JWT由三部分组成:Header(头部), Payload(负载), Signature(签名)

格式为:
Header.Payload.Signature

例如:(HS256)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

或 (RS256)
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.POstGetfAytaZS82wHcjoTyoqhMyxXiWdR7Nn7A29DNSl0EiXLdwJ6xC6AfgZWF1bOsS_TuYI3OG85AmiExREkrS6tDfTQ2B3WXlrr-wp5AokiRbz3_oB4OxG-W9KcEEbDRcZc0nH3L7LzYptiy1PtAylQGxHTWZXtGz4ht0bAecBgmpdgXMguEIcoqPJ1n3pIWk_dUZegpqx0Lka21H6XxUTxiy8OcaarA8zdnPUnV6AmNP3ecFawIFYdvJB_cm-GvpCSbr8G8y_Mllj8f4x9nBH8pQux89_6gUY618iYv7tuPWBFfEbLxtF2pZS6YC1aSfLQxeNe8djT9YjpvRZA

Header:

{
  "alg": "HS256",
  "typ": "JWT"
}

alg属性表示签名的算法 (默认是 HMAC SHA256 即HS256)
typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT

Payload:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

除了官方字段,还可以添加自定义字段。如这里的admin字段就是自定义字段。

Signature:

Signature 部分是对前两部分的签名,防止数据篡改。

服务器使用一个指定的密钥,按照下面的签名算法(默认为HS256)产生签名
(RS256有一个公钥和一个私钥)

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

RSASHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  PUBLIC KEY, PRIVATE KEY)

然后将这三个部分分别base64编码后用“.”连接生成JSON Web Token

话说文章里面的名字取的还蛮不错的。

Weiterlesen »

说在前面

这次和队友一起去川师打了一次线下的CTF。虽然比赛中很多题都没做出来,但学到很多东西。赛后出题师傅也给出了源码和Writeup,抓住机会总结学习。

重新搭建题目的环境有点困难,所以还是有两题无法进行复现。

Web

418

打开网页后是一个418的错误页面。

pic

Google了一下418错误

“ERR!418 我是茶壶”起源
“错误 418 我是茶壶”消息不是标准的服务器错误类型,这是 1998 年的一个愚人节恶作剧,距今已有 20 年了。许多开发团队在他们的应用程序中实施了“错误 418 我是茶壶”的消息作为内部笑话,通常使用这个错误来处理未知来源的错误。

又在cookie处发现了一个base64加密的值: 解密后为:coffee

pic

用Brupsuite抓包后修改了cookie的值,网页提示:

Tell me what you want ! 

于是我修改为flag的加密值,没用。在修改很多次之后队友解出来了。竟然是tea的base64。

修改cookie后访问得到flag,这题,真的有点考脑洞。

pic

Weiterlesen »

Web - Justsoso

使用php伪协议读到hint和index的源码:

/index.php?file=php://filter/read=convert.base64-encode/resource=hint.php

  • index.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
error_reporting(0);
$file = $_GET["file"];
$payload = $_GET["payload"];

if (!isset($file)) {
echo 'Missing parameter' . '<br>';
}

if (preg_match("/flag/", $file)) {
die('hack attacked!!!');
}

@include ($file);
if (isset($payload)) {
$url = parse_url($_SERVER['REQUEST_URI']);
parse_str($url['query'], $query);
foreach ($query as $value) {
if (preg_match("/flag/", $value)) {
die('stop hacking!');
exit();
}
}
$payload = unserialize($payload);
} else {
echo "Missing parameters";
}
?>
Weiterlesen »

这次DDCTF真的是学到很多东西,希望后面可以多多参加比赛锻炼自己。

Web - 滴~

地址:http://117.51.150.246/

BASE64解码两次jpg参数的值:666C61672E6A7067

再经过一次16进制转字符串:flag.jpg

可知页面读取文件的名称是先经过两次BASE64解码再经过一次进制转换得到的。

尝试读取index.php:

http://117.51.150.246/index.php?jpg=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

页面返回得到data协议里的经过BASE64处理后的数据,解码后得到源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

<?php
/*
* https://blog.csdn.net/FengBanLiuYun/article/details/80616607
* Date: July 4,2018
*/
error_reporting(E_ALL || ~E_NOTICE);

header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
header('Refresh:0;url=./index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09');
$file = hex2bin(base64_decode(base64_decode($_GET['jpg'])));
echo '<title>'.$_GET['jpg'].'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
echo $file.'</br>';
$file = str_replace("config","!", $file);
echo $file.'</br>';
$txt = base64_encode(file_get_contents($file));

echo "<img src='data:image/gif;base64,".$txt."'></img>";
/*
* Can you find the flag file?
*
*/

?>
Weiterlesen »

[TOC]

基础知识

靶机包含漏洞类型分类

漏洞类型

如何判断上传漏洞类型

判断上传漏洞类型

Upload

Pass-01

尝试上传了一个PHP,反应很快弹出格式要求窗口。再根据网页源码判断,应该是使用了JS判断。

  1. 用Brupsuite抓包
  2. 然后将filename修改为“shell.php”
  3. 在文件内容里添加<?php eval($_POST[three])?>
  4. 上传之后用菜刀连接

这个除了js之外都没有什么检查。

Weiterlesen »

Simple note:

CRLF: Carriage-Return Line-Feend.

Use CR, ASCII 13 \r (回车) , LF, ASCII 10, \n and %0d%0a to break the HTTP request.

In the penetration test, if we found a request is like this:

1
2
3
GET /test/demo.php?url=https://www.threezh1.com
That we can contral.
....

If the HTTP Header of the request return with the response, which means we can control the HTTP Header.(Of course include the Url.)

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Connection: keep-alive
Content-Encoding: deflate
...
That we can contral.
...
Locations=https://www.threezh1.com
Weiterlesen »
0%