关卡地址
解决方案:
思路:
这一关给了一部电话,并且提示:phone that evil
。电话按键只有“5”这个按键是可用的,点击后会得到如下提示:
faultCode
105
faultString
XML error: Invalid document end at line 1, column 1
在网上搜索可以得到xmlrpc相关的解决方案,结合标题与图片下提示,可以猜测出我们需要通过xmlrpc调用给evil打电话。
xmlrpc服务器地址是:http://www.pythonchallenge.com/pc/phonebook.php
通过ServerProxy可以枚举出服务器提供的方法:
[‘phone’, ‘system.listMethods’, ‘system.methodHelp’, ‘system.methodSignature’, ‘system.multicall’, ‘system.getCapabilities’]
其中phone
方法即为所需。
接着获取到phone方法的签名及使用帮助:
[[‘string’, ‘string’]]
Returns the phone of a person
可以看出:
phone方法返回一个字符串类型的值,需要一个字符串类型的参数。
返回值为一个人的电话号码。
参数是evil的名字,在上一关已经得到了。
请求后得到的电话号码是:
555-ITALY
将其做为下一关地址访问会得到404 NOT FOUND
提示,去掉555-
后访问会提示:SMALL letters.
所以下一关地址是:italy
代码:
import xmlrpc.client
serverUrl="http://www.pythonchallenge.com/pc/phonebook.php"
serverProxy=xmlrpc.client.ServerProxy(serverUrl)
# 枚举xmlrpc服务
# print(serverProxy.system.listMethods())
# print(serverProxy.system.methodSignature('phone'))
# print(serverProxy.system.methodHelp('phone'))
phoneNumber=serverProxy.phone('Bert')
print(phoneNumber)
PS src\static> python .\Code\Python\Challenge013.py
# 选择安装模块或者使用源码
# 安装XmlRpc模块(已发布)
# Install-Module -Name PSXmlRpcClient
# 将XmlRpc源码作为git子模块克隆到Modules目录下
# 添加子模块
# git submodule add https://github.com/3gbywork/PSXmlRpcClient.git .\Code\PowerShell\Modules\PSXmlRpcClient
# git submodule init
# 更新子模块
# git submodule init
# git submodule update
# 删除子模块
# git rm .\Code\PowerShell\Modules\XmlRpc
# 加载XmlRpc模块
# Import-Module .\Code\PowerShell\Modules\PSXmlRpcClient\PSXmlRpcClient.psm1
$serverUrl="http://www.pythonchallenge.com/pc/phonebook.php"
# Invoke-XmlRpcRequest -ServerUri $serverUrl -MethodName "system.listMethods"
# Invoke-XmlRpcRequest -ServerUri $serverUrl -MethodName "system.methodSignature" -Params "phone"
# Invoke-XmlRpcRequest -ServerUri $serverUrl -MethodName "system.methodHelp" -Params "phone"
Invoke-XmlRpcRequest -ServerUri $serverUrl -MethodName "phone" -Params "Bert"
PS src\static> .\Code\PowerShell\Challenge013.ps1
package main
import(
"fmt"
"github.com/kolo/xmlrpc"
)
func (c *Challenge) Challenge013() {
client, err := xmlrpc.NewClient("http://www.pythonchallenge.com/pc/phonebook.php", nil)
if err != nil {
fmt.Println("Can't create client: ", err)
}
defer client.Close()
// var methods []string
// client.Call("system.listMethods", nil, &methods)
// fmt.Println(methods)
// var signature [][]string
// client.Call("system.methodSignature", "phone", &signature)
// fmt.Println(signature)
// var help string
// client.Call("system.methodHelp", "phone", &help)
// fmt.Println(help)
var result string
client.Call("phone", "Bert", &result)
fmt.Println(result)
}
PS src\static> .\Code\Go\Challenge.exe -l 013