🍀本人简介:
吉师大一最爱逃课的网安混子、 华为云享专家、阿里云专家博主、腾讯云自媒体分享计划博主、 华为MindSpore优秀开发者、迷雾安全团队核心成员,CSDN2022年运维与安全领域第15名
🍂做你想做的,错了算我的,不会要研究
你就不能百度一下吗? https://www.baidu.com 你就不能Google一下吗? https://www.google.com 你就不能Bing一下吗? https://www.bing.com 你就不能NAVER一下吗? https://search.naver.com 你就不能DuckDuckGo一下吗? https://duckduckgo.com 你就不能GitHub一下吗? https://github.com 你就不能F搜一下吗? https://fsofso.com 你就不能StackOverflow一下吗? https://stackoverflow.com 你就不能哔哩哔哩一下吗? https://search.bilibili.com 你就不能Yahoo一下吗? https://hk.search.yahoo.com 你就不能Yandex一下吗? https://yandex.com 你就不能维基百科一下吗? https://zh.wikipedia.org 你就不能萌娘百科一下吗? https://zh.moegirl.org.cn
前几天碰到一个需要绕过图片验证码的题,由于刷的双系统,缺失某些配置,一般的工具我是用不了了
求助寄师傅,被告知Python模块中有个dddd可以用来识别图片验证码
但如果想要在Yakit中使用,还需要编写一个Yakit的插件,于是我顺理成章地去学Yakit官方编程语言
Yaklang
我对这个语言的评价:
和Python一样方便,和HTML一样自由,和Golang一样高效
Hello Yaklang
输出语句
println("Hello\nYaklang")
采用println+双引号,换行符什么的也可以正常使用
或者可以这样
println(`Hello Yaklang`)
在Yaklang中,使用反引号可以进行多行输出,但缺点是输出的语句中不能包含反引号
注释
关于Yakit中的注释,共有三种
# 号注释 # Comment 普通注释 // Comment 多行注释 /* Hello YakComment */
变量的定义
在Yaklang中,有很多种定义变量的方法
例如
1、可以使用Golang 风格,进行声明变量
var abc = 123 var a,b = 1,2
2、强制创建变量
abc := 123
3、自动创建变量(类Python)
abc = 123 a,b = 1,2
数据类型
谈到了变量,那么就很难避开数据类型这个话题,Yaklang中的数据类型其实很简单
string 字符串类型,用以快速构建一个字符串
int 整数类型:在 64 位机中,int 和 int64 是一样的
float 浮点类型,用来定义和表示浮点数
byte 本质上等同于 uint8
undefined / nil 为定义的值,我们可以理解为空值
bool 只有 true 或 false
map,基本等同于 Python 中的 Dict(字典)
slice,基本等同于 Python 中的 List(列表)
channel,基本等同于 Golang 中的 Channel
var,任意类型,等同于 Golang 中的 interface{}
在实际编程中,我们若想返回数据类型,可使用dump()
基础字符串的使用
定义
定义字符串可以有两种方式
利用双引号/利用反引号
前者是基本所有语言通用
后者则是可以避免转义字符
字符声明
以下是官方给的示例
c = 'c' println(c) c = '\x20' println(c) /* 99 32 */
可以看到当c等于字符串c时返回了ASCII值
设置为\x20时返回了32
那么这个\x20是个什么玩意
它是一个字符序列,由反斜杠“ \”, 字母x(或X)和以下1-2个十六进制数字组成. 例如,“ \ x30”,“ \ x41”和“ \ X61”分别代表 字符“ 0”,“ A”和“ a”. 因为字符'0','A'和'a'的ASCII码的 十六进制值分别为0x30、0x41和0x61.
字符串:字节序列(bytes)
如果我们想要快速创建一个原始字节,可以在将要输出的字符串前加b来进行声明
name = b"Hello World Hello Yaklang" dump(name)
当然,该前缀也适合于反引号包裹的字符串
name = b`Hello World Hello Yaklang` dump(name)
字符串:% 格式化语法
Yaklang中的格式化语法说实话有点像Python
例如
println("Hello %v" % "World") /* Hello World */ println("Hello %v + %v" % ["World", "Yaklang"]) /* Hello World + Yaklang */ println("Hello %v" % "World") /* Hello World */ println("Hello %v + %05d" % ["World", 4]) /* Hello World + 00004 */
此处注意
%v即为var类型,在该语言中指任意类型
模版字符串语法 f-string
该语法同前面的字节差不多,处理方式类似于JS就是在输出语句前加上f,即可以通过${var}来引用变量的值,这样的方式,可以快速把一个值注入到字符串中
a = "World" name = "V1ll4n" println(f`Hello ${a}, Hello ${name}`) /* OUTPUT: Hello World, Hello V1ll4n */ println(f`1+1 = ${1+1}`)//反引号 /* OUTPUT: 1+1 = 2 */ println(f"1+1 = ${1+1}")//双引号 /* OUTPUT: 1+1 = 2 */
在我们处理数据包时,即可通过该方式
var targetPath = "admin.php?id=1"//地址 var addr = "example.com:8080"//域名 var payload = codec.EncodeUrl("1'or''='1")//将拼接的SQL语句通过url编码 packet = f`GET /${targetPath} HTTP/1.1//模拟请求头 Host: ${addr} key=value&key2=${payload}`即为上述S经编码后的SQL语句 /* GET /admin.php?id=1 HTTP/1.1 Host: example.com:8080 key=value&key2=%31%27%6f%72%27%27%3d%27%31 */
字符串:Fuzztag 快速执行 x-string
这个知识点也是比较重要的,我要是早知道就不会跟个憨批一样拿Python循环去生成字典了
直接把官方的引用过来
Fuzztag 是 Yak 一个特色功能,在生成数据包进行模糊测试领域有非常广泛的使用,并广受用户好评。
新版本的 Yak 中,我们为 fuzztag 新设计了x-string 使用 x 作为字符串声明的前缀,可以快速实现 fuzztag 的渲染,例如我们 x"{{int(1-10)}}" 可以生成 ["1", "2", "3" ... "10"] 的数据
那么在实战中,我们可以对需要爆破且指定范围的参数
例如pwd、vcode
进行模糊参数测试,下面简单举个例子