【脚本】正则表达式详解

最近在Github上遇到了个很好的学习正则表达式的仓库
Github-Learn-regex
对于一些正则表达式的高级应用我也不是很熟,于是来重新学习下
在线测试网站Regex101

什么是正则表达式?

正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。

1. 基本匹配

正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成。
例如:一个正则表达式 the,它表示一个规则:由字母t开始,接着是h,再接着是e

"the" => The fat cat sat on the mat.

正则表达式123匹配字符串123。它逐个字符的与输入的正则表达式做比较。
正则表达式是大小写敏感的,所以The不会匹配the

"The" => The fat cat sat on the mat.

2. 元字符

正则表达式主要依赖于元字符。
元字符不代表他们本身的字面意思,他们都有特殊的含义。一些元字符写在方括号中的时候有一些特殊的意思。以下是一些元字符的介绍:

元字符 描述
. 句号匹配任意单个字符除了换行符。
字符种类。匹配方括号内的任意字符。
[^ ] 否定的字符种类。匹配除了方括号里的任意字符
* 匹配>=0个重复的在*号之前的字符。
+ 匹配>=1个重复的+号前的字符。
? 标记?之前的字符为可选.
{n,m} 匹配num个大括号之前的字符或字符集 (n <= num <= m).
(xyz) 字符集,匹配与 xyz 完全相等的字符串.
| 或运算符,匹配符号前或后的字符.
\ 转义字符,用于匹配一些保留的字符 ( ) { } . * + ? ^ $ \ |
^ 从开始行开始匹配.
$ 从末端开始匹配.

继续阅读【脚本】正则表达式详解

【SQLI】SQLI攻击与防护

SQL注入

约有如下13种:

  1. Boolean盲注

    与时间盲注类似,但是用于有明显回显情况

  2. Union注入
    最常见的注入方式之一

    1' union select 1,2,database() --+
  3. 文件读写

    select '' into outfile '/var/www/c.php' --+
  4. 报错注入

    floor()、extractvalue()、updatexml()、geometrycollection()、multipoint()、polygon()、multipolygon()、linestring()、multilinestring()、exp()

  5. 时间盲注

    sleep()

  6. REGEXP正则匹配

    PCRE绕过:union/‘+’a’1000001+’*/select

  7. 宽字节注入

    运用GBK与UTF-8编码不同来绕过转义

  8. 堆叠注入

    两句代码以分号等方式隔开:select * from users where id=1;select 1,2,3;

  9. 二次注入

    巧妙利用update等方式,用已有的数据进行注入

  10. User-Agent注入、11.Cookie注入

    10,11两种其实只是个注入位置的区别而已,可以采用Burp或者直接Curl构造payload实现

  11. 过滤绕过

    union绕过,双写绕过,注释绕过等

  12. 万能密码

    admin’ or ‘1’=’1
    username = secpulse’=’ password = secpulse’=’
    ffifdyop

SQL防护

  1. 预编译

    String sql="select id,no from user where id=?";
    PreparedStatement ps=conn.prepareStatement(sql);
    ps.setInt(1,id);
    ps.executeQuery();

    采用了PreparedStatement,就会将sql语句:”select id, no from user where id=?” 预先编译好也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。
    所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行,必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。
    所以sql语句预编译可以防御sql注入。

  2. PDO

    也是一种预编译的方式,常用在PHP的数据库查询上,绑定的参数不需要使用引号,也可以有效防止注入

  3. 正则表达式过滤

    实在不行,那就自己写过滤!

继续阅读【SQLI】SQLI攻击与防护

【CTFd】靶场安装与配置

建议使用新版【CTFd】靶场安装与配置(同时支持Whale+Owl+AWD的Docker一键配置版v2)

CTFd是githbu上开源的ctf靶场之一,配合上whale等插件,可以快速搭建一个靶场

CTFd

以下测试环境均为Ubuntu20.04,Python3.8
CTFd官网
CTFd-Github仓库
CTFd中文汉化
由于本人更喜欢汉化风格,所以使用的均为CTFd_chinese_CN下3.4.1版本的CTFd

  1. 克隆CTFd代码并安装相关依赖
    #如果空白环境
    sudo ./prepare.sh
    #如果是在宝塔环境下安装(bt自带的python会产生冲突)
    sudo apt-get --fix-broken install
    #如果已经安装好python环境(建议使用3.7)
    sudo pip install -r requirements.txt
  2. 下载CTFd_chinese_CN-v3.4.1并将CTFd目录覆盖到你的项目目录
  3. 运行,默认运行在http://127.0.0.1:4000,你可以通过更改配置文件使其监听0.0.0.0,或者使用nginx反代,此处使用后者
    #配置文件CTFd/config.ini
    python serve.py

    继续阅读【CTFd】靶场安装与配置

【脚本】安卓虚拟机配置

本文分为CM-x86和WSA(Win11安卓子系统)两部分

CM-x86

CM-x86是Android-x86的衍生版本,用作PC的安卓虚拟机再好不过
我使用的是CM-x86-14.1(64位),以下为配置
file
在安装时有以下几步

  1. GPT安装 NO
  2. 创建新磁盘(New)->设置为启动盘(bootable)->写入分区表(Write)
  3. 安装Grub引导
  4. EXT4文件格式
  5. Reboot重启即可

但是完成以上几步,只能进入到安卓的Shell模式,无法进入图形界面,可以选择下面第三个的nomodeset模式
file

继续阅读【脚本】安卓虚拟机配置

【CRYPTO】MD5算法详解

前言

MD5是一种哈希算法,用来保证信息的完整性。
就一段信息对应一个哈希值,且不能通过哈希值推出这段信息,而且还需要保证不存在任意两段不相同的信息对应同一个哈希值。
不过MD5算法算出来的值也就16byte(即128bit),肯定存在相同的,找到另一个所花时间长短而已。

填充信息

我们要对一个字符串进行MD5计算,那么肯定要从这个字符串的处理入手。
我们知道一个字符的长度是1个byte,即8bit的长度。
MD5对待加密的字符串的处理是将一个字符串分割成每512bit为一个分组,形如N*512+R,这里的R是余下的位数。这个R分为几种情况:

  • R=0时,需要补位,单补上一个512bit的分组,因为还要加入最后64个位的字符串长度。
  • R<448时,则需要补位到448位,后面添加64位的字符串长度。
  • R>448时,除了补满这一分组外,还要再补上一个512位的分组后面添加64位的原字符串长度。

补位的形式是先填充一个1,再接无数个0,直到补足512位。

举例:
消息内容为“HUANG”,就能得到以下内容

48 55 41 4E 47 80 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 [28 00 00 00 00 00 00 00]低位在左边

最后面这里有个0x28,数8个字节,就是0x0000000000000028,刚刚好是十进制的40,消息的内容是5个byte,也就是40bit
还要注意到这里是小端字节序存储

继续阅读【CRYPTO】MD5算法详解

【MISC】Wordle

TQLCTF-Wordle题目出自当下火热的填字游戏
填字游戏的规则为输入五个字母,然后分别返回五个颜色

  • 绿色:位置和字母均正确
  • 黄色:字母正确位置不正确
  • 灰色:字母和位置均不正确

我们的任务就是用最少的次数,把答案找出来
在该题目中,颜色可以通过字节流分辨出来。在这之前,我在B站大学看到过一个讲述相关技术的视频,于是我就翻了下。
利用信息论解决Wordle问题
理论存在,实践开始
于是,又写了一个10K的代码,发现自己的代码只能做到平均4.3左右。
好废物啊我
于是上Github找轮子Wordle-solver
这个开源项目能做到平均3.4,然后就有了如下10K代码

继续阅读【MISC】Wordle

【脚本】WSL数据磁盘迁移

Windows中WSL默认磁盘为C盘,这导致在安装了Docker,Kali,Ubuntu等WSL后,C盘空间不足,于是参照相应Issue有如下脚本

#以下脚本均应该在PowerShell管理员模式下运行
wsl --list -v
PS C:\Windows\system32> wsl --list -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
  kali-linux             Stopped         2
#查看相应WSL
wsl --shutdown
#停止WSL
wsl --export Ubuntu F:\WSL\Ubuntu.tar
wsl --export docker-desktop F:\WSL\docker-desktop.tar
wsl --export docker-desktop-data F:\WSL\docker-desktop-data.tar
wsl --export kali-linux F:\WSL\kali-linux.tar
#导出WSL
wsl --unregister Ubuntu
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data
wsl --unregister kali-linux
#删除对应WSL
wsl --import Ubuntu F:\WSL\Ubuntu F:\WSL\Ubuntu.tar --version 2
wsl --import docker-desktop F:\WSL\docker-desktop F:\WSL\docker-desktop.tar --version 2
wsl --import docker-desktop-data F:\WSL\docker-desktop-data F:\WSL\docker-desktop-data.tar --version 2
wsl --import kali-linux F:\WSL\kali-linux F:\WSL\kali-linux.tar --version 2
#在新位置重新导入
wsl -d Ubuntu exit
wsl -d docker-desktop exit
wsl -d docker-desktop-data exit
wsl -d kali-linux exit
#重新对应WSL
ubuntu config --default-user root
kali config --default-user root
#设置Ubuntu/kali默认用户

【脚本】NC中的SHA256解密

VNCTF-CRYPTO-ezmath是一道完全没难度的密码题,但是又是一道非常有难度的脚本题
这题只要返回4*N就好,难度就在写脚本了
在PWN等运用到nc的题目中,Sha256是最好的防止扫端口的计算方法。
由于Sha256不可逆,我们只好通过暴力或者撞库的方式找出所有解
但是这题又使用的是Sha256(????+XXXXXXXXXXXX)这样的方式,所以只好选择暴力了
再配合上pwntools,发就完事了
继续阅读【脚本】NC中的SHA256解密

【MISC】BASE系列加密解析

见到了一题比较离谱的base64题目,VNCTF2022-Web-gocalc0,可能是我太菜的原因,明明hint告诉我,flag在session里面,我却怎样都Base64出不来,一直说解密出错。
这题对于Web没有一点难度,姑且放在MISC分类里面。

Base16

使用字符:数字(0 ~ 9),字母(A ~ F)
Base16先获取输入字符串每个字节的二进制值(不足8bit在高位补0),然后将其串联进来,再按照4bit一组进行切分(2^4=16),将每组二进制数分别转换成十进制,并对应下述编码。
即二进制转十六进制,对应下表

编码 编码 编码 编码
0 0 4 4 8 8 12 C
1 1 5 5 9 9 13 D
2 2 6 6 10 A 14 E
3 3 7 7 11 B 15 F

继续阅读【MISC】BASE系列加密解析