misc&web补题

补点题

misc

1

https://hell38vn.wordpress.com/

binwalk发现好多图片 除了三张都是国旗

题目有说 photo take 所以应该关注不是国旗的 ‘照片’

在 其中一张 用 Stegsolve 打开发现字符串

2

给了个 Windows .exe

peid查一下 是 .net 文件 用 dnspy反编译 拿到一张图片

使用 zsteg 拿到flag

3

直接binwalk不行 显示有 zip但提取不出来 修复zip文件 0506->0304

再次binwalk 成功拿到 pdf 但发现是 0字节

还有个压缩包 这里 7z解压可以拿到真正的pdf

—-好吧 7z 无敌了 修完zip直接7z就可以拿到pdf

但pdf还是打不开 是crc错误

可以手动试也可以直接在线修复

https://www.pdf-online.com/osa/repair.aspx

成功打开 pdf发现里面没flag 应该被隐藏了

转成 text 试试

linux下可以安装pdftotext
https://www.cyberciti.biz/faq/converter-pdf-files-to-text-format-command/

也可以直接在线转

https://pdftotext.com/

成功拿到flag

4

zip末尾有 KP字样

反转文件

py脚本

1
open("reversed", "wb").write(open("original", "rb").read()[::-1])

5

file一下 ntfs字样

使用ntfsundelete工具可以查看是否有任何已删除的文件

ubuntu自带这个软件

可以看到一些文件可以恢复

ntfsundelete mrreagan -u -i Inode 恢复文件

得到

$Info : c2N0ZnszbD
$Secure : NjdHIwbTRn
$Boot : bjN0MWNfcH
$Extend : VsNTNfdzRz
$LogFile : X2Y0azN9Cg
Morpheus.txt : This line is tapped, so I must be brief.
Tank.txt : 73656366
Dozer.txt : 73656366
Trinity.txt : I was looking for an answer. It’s the question that drives us mad.
Neo.txt : What is the Matrix.

$Info : c2N0ZnszbD
$Secure : NjdHIwbTRn
$Boot : bjN0MWNfcH
$Extend : VsNTNfdzRz
$LogFile : X2Y0azN9Cg 拼接起来解 base64

6

这题思路太骚了 给张图片 识图找到原图(960*678)

然后用 ps查找图像不一样的地方

放在两个图层 重叠 上层图层模式选差值 相同地方会变成黑色 不一样的地方自然显出来

当然这题因为只在图片表面更改才能这样做

7

压缩包提示 5位数密码 跑一遍没有。。

再时下 居然 4位 的。。。。。。

以后提示几位爆破 <= 位数的

后面16位大写字母和数字 是md5

web

1

伪静态技术 昨天在ph牛的一篇文章里又突然看到

伪静态技术(pseudo-static),又名URL重写(URL rewriting)

/test.php/aaa.html也是能正常访问/test.php,可能是服务器解析到.php后就把后面的/aaa.html当作参数处理

例如你原本想弄的是index.php?id=123,但你想隐藏其真实的文件路径,你通过URL重写技术,可以达到访问test/123.html而实际上在访问index.php?id=123

这题是 /indirection/index.php/index.php 绕过 主要是这个概念以前没注意过

2

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
<html>
<head>
welcome to simplexue
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
$conn = mysql_connect("********, "*****", "********");
mysql_select_db("phpformysql") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
$user = $_POST[user];
$pass = md5($_POST[pass]);
$sql = "select pw from php where user='$user'";
$query = mysql_query($sql);
if (!$query) {
printf("Error: %s\n", mysql_error($conn));
exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];
if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
echo "<p>Logged in! Key:************** </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.txt">
</html>

直说关键的 大体我们密码输一个字符如 1 然后想把1的md5输进去让它比较

但是我们不知道 pw的值 导致它写的语句我们不可控

所以我们构造 and 0=1 使前面它的查询语句为假 就会显示union后的

这里我终于明白为啥以前有时候要把 id=-1 道理是一样的 让它查询为假 特别只有一个回显位时 显示出 union后面的结果

然后 union 上我们自己的查询语句

union select “c4ca4238a0b923820dcc509a6f75849b” 可直接赋值

别忘了闭合前面的 ‘ 并且注释掉后面的 ‘

最终payload

user=’ AND 0=1 UNION SELECT “c4ca4238a0b923820dcc509a6f75849b” %23&pass=1

3

脚本练习题 获取 响应头中参数 在短时间内提交

获取响应头中指定参数
https://blog.csdn.net/DDQ_DQ/article/details/78614198

1
2
3
4
5
6
7
8
import requests
r = requests.get('http://httpbin.org/get')
print(r.headers) #获得响应头信息
print(r.headers['Content-Type'])
print(r.headers.get('Content-Length'))
>>`{'X-Processed-Time': '0.000617980957031', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'Content-Length': '268', 'X-Powered-By': 'Flask', 'Date': 'Thu, 23 Nov 2017 04:13:40 GMT', 'Server': 'meinheld/0.6.1', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true', 'Content-Type': 'application/json'}
>>application/json
>>268`

拿到后进一步处理 切片 正则 或直接字符串切割
https://blog.csdn.net/hawkerou/article/details/53518154

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
# -*- coding:utf8 -*-
import requests
import base64
import re #可选
url = "http://ctf5.shiyanbar.com/web/10/10.php"
s0 = requests.get(url)
s1 = s0.headers['FLAG']
s2 = base64.b64decode(s1)
#s3 = s2[25:34] 切片
#s3 = s2.split(':')[1] 字符串切割
s3 = re.split(r':',s2)[1] #正则
data = {'key':s3}
s = requests.post(url,data=data).content
print s

4

表单的题目 右键源码 看看有没有 hidden 的 当时这题没注意这点卡住了

5

脚本练习题 给一个sha1值,它是0-100000之间的整数的md5值再求取sha1值,请在2秒内提交该整数值

这题一开始wrong好久 后来发现第一次请求没带上 cookies 。。。。。

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
#!/usr/bin/env python
# -*- coding:utf8 -*-
import requests
import hashlib
def get_md5(temp):
md5str = temp
m1 = hashlib.md5()
m1.update(md5str.encode("utf-8"))
md5 = m1.hexdigest()
return md5
def get_sha1(temp):
sha1str = temp
s1 = hashlib.sha1()
s1.update(sha1str.encode("utf-8"))
sha1 = s1.hexdigest()
return sha1
url = "http://ctf5.shiyanbar.com/ppc/sd.php"
cookies = {
"Hm_lvt_34d6f7353ab0915a4c582e4516dffbc3":"1533192936",
"Hm_cv_34d6f7353ab0915a4c582e4516dffbc3":"1*visitor*101742%2CnickName%3Amerl1ng.cc",
"Hm_lpvt_34d6f7353ab0915a4c582e4516dffbc3":"1533472959",
"PHPSESSID":"i1ae17toas5m38hutf4kguuj46"
}
s0 = requests.get(url=url,cookies=cookies).content
s1 = s0[580:620]
t = 0
while(t <= 100000):
t1 = str(t)
p = get_md5(t1)
p1 = get_sha1(p)
if (p1 == s1):
break
t = t + 1
data = {'inputNumber':t,'submit':'提交'}
flag = requests.post(url=url,data=data,cookies=cookies).content
print flag

ppc

练练小jio本

双基回文数

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
#!/usr/bin/env python
# -*- coding:utf8 -*-
def f(n,x):
#n为待转换的十进制数,x为机制,取值为2-16
a=[0,1,2,3,4,5,6,7,8,9,'A','b','C','D','E','F']
b=[]
while True:
s=n//x#商
y=n%x#余数
b=b+[y]
if s==0:
break
n=s
b.reverse()
return b
def issj(temp):
a = 0
b = 10
s1 = []
s2 = []
while(b > 1):
s1 = f(temp,b)
#print s1
s2 = s1[::-1]
#print s2
if(s1 == s2):
a = a + 1
b = b - 1
if(a >= 2):
return 1
else:
return 0
t = 1600000
while(1):
if(issj(t)):
print t
break
t = t + 1

进制转换的部分可以当轮子用

大数模运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
# -*- coding:utf8 -*-
s=1
for x in [3,5,823]:
i=x
ss=1
for j in range(0,12345): #这个循环就是用来求每个括号中等比数列和的
ss=(i+ss)%9901 #每次计算的中间结果都模一下9901,这样使得计算的数不会变得很大,可加快计算
i=i*x%9901
s=s*ss%9901 #把每个等比数列和相乘
print(s)
# 首先将12345因式分解成素因子的幂的形式 3*5*823
# 它们所有因子的和可以表示成 可以通过排列组合的原理验证(1+3+3^2+3^3+……+3^12345)(1+5+5^2+5^3+……+5^12345)(1+823+823^2+823^3+……+823^12345)

计算网页上的表达式

很容易查到是 eval 但这里有一点值得注意 py2 和py3对字符串的处理是不一样的

py3的话会带上 ‘’ 比较时要去掉

这里py2和py3都写了一边 方便以后看

py2

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
#!/usr/bin/env python
# -*- coding:utf8 -*-
import requests
import re
url = "http://ctf5.shiyanbar.com/jia/"
cookies = {
"Hm_lvt_34d6f7353ab0915a4c582e4516dffbc3":"1533192936",
"Hm_cv_34d6f7353ab0915a4c582e4516dffbc3":"1*visitor*101742%2CnickName%3Amerl1ng.cc",
"Hm_lpvt_34d6f7353ab0915a4c582e4516dffbc3":"1533472959",
"PHPSESSID":"i1ae17toas5m38hutf4kguuj46"
}
s0 = requests.get(url=url,cookies=cookies).content
s1 = s0[1053:1105]
s1=str(s1)
pattern = re.compile(r'x')
#print (pattern.findall(s2))
s3 = re.sub(pattern, '*', s1)
s4 = (eval(s3))
data = {'pass_key':s4}
flag = requests.post(url=url,data=data,cookies=cookies).content
print (flag)

py3

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
#!/usr/bin/env python
# -*- coding:utf8 -*-
import requests
import re
url = "http://ctf5.shiyanbar.com/jia/"
cookies = {
"Hm_lvt_34d6f7353ab0915a4c582e4516dffbc3":"1533192936",
"Hm_cv_34d6f7353ab0915a4c582e4516dffbc3":"1*visitor*101742%2CnickName%3Amerl1ng.cc",
"Hm_lpvt_34d6f7353ab0915a4c582e4516dffbc3":"1533472959",
"PHPSESSID":"i1ae17toas5m38hutf4kguuj46"
}
s0 = requests.get(url=url,cookies=cookies).content
s1 = s0[1053:1105]
s1=str(s1)
s2=s1[2:-1]
print (s2)
pattern = re.compile(r'x')
#print (pattern.findall(s2))
s3 = re.sub(pattern, '*', s1)
s3=s3[2:-1]
print (s3)
s4 = (eval(s3))
print(s4)
data = {'pass_key':s4}
flag = requests.post(url=url,data=data,cookies=cookies).content
print (flag)