zoukankan      html  css  js  c++  java
  • CG-CTF(5)

    CG-CTF

    https://cgctf.nuptsast.com/challenges#Web

     

      续上~

      第二十二题:SQL注入1

     

      点击Source:

      分析:

      mysql_select_db()函数:设置MySQL数据库;

      trim()函数:移除两侧的预定义字符;

     

      mysql_query()函数:执行一条MySQL查询;

     

      mysql_fetch_array函数:从结果集取得一行作为关联数组;

     

      执行的sql语句:

    select user from ctf where (user='".$user."') and (pw='".$pass."')

      整段代码唯一一个过滤机制是trim()函数,对两端的空格等预定义字符进行了过滤,且只校验了user == admin即可获取flag,那么直接在user参数里构造,注释掉后面的pass即可;

      构造admin“)#,注意闭合语句即可;

     

     

      取得flag(干杯~);

     

      第二十三题:pass check

     

      代码分析:

      这里用到了isset()函数检测变量是否被赋值,用strcmp()函数比较$pass和$pass1两个变量;

     

     

      但是strcmp()函数在被比较的两个参数相等的情况下返回0,而在PHP5.3版本之前存在一个漏洞,就是如果参数的数据类型是strcmp()函数无法识别的也会返回0,所以在这里我们让pass变为数组即可获得flag,由于题目地址出错就不做验证了;

     

      第二十四题:起名字真难

     

      代码分析:

      设定了一个函数function noother_says_correct($number):

      ord()函数:返回ASCII码;

     

      然后设置了一个for循环,将$number的每一位进行判定,若其ASCII码在49(1的ASCII码)和57(9的ASCII码)之间,则返回false,若不在这两者之间,将$number与字符串'54975581388'进行比较并返回比较结果;

      然后将?key的值放入函数,若返回true,则取得flag;

      思路:也就是说?key的值必须和'54975581388'相同,又不能在1-9之间;尝试使用不同的进制数,二进制必有1,所以肯定不行,八进制除了0也都在1-9之间,看看'54975581388'的十六进制是啥:0xccccccccc!完美避开了1-9;

      取得flag(干杯~);

     

      第二十五题:密码重置

     

      先尝试随便输个新密码和验证码看看;

     

      返回error;

      用burp抓包;

      观察的时候发现有个user1的参数,形似base64加密后的样子,尝试解码;

      结合题干(重置管理员账号admin的密码),对admin进行base64加密并修改参数;

      取得flag(干杯~);

     

      第二十七题:SQL Injection

     

      查看源代码:

      代码分析:

      用htmlentities()函数将字符转换为html转义字符,并将双引号、单引号都进行转换;

     

     

      mysql_query()函数执行MySQL查询,此处查询语句为:

    SELECT*FROM user WHERE name = '$username' AND pass = '$password'

      思路:在用了转义函数之后,我们不能用单引号进行简单的闭合,题干中有个TIP,反斜杠可以用来转义,而在MySQL查询语句中,转义的单引号不会参与语句的闭合,那么如果我们用反斜线将name参数原本用来闭合的单引号转义掉,那么pass参数的第一个单引号就会成为name参数的闭合单引号,而我们就可以在pass参数上执行语句了;

      构造name=&pass=or 1=1#(当然放在URL中时我们需要用URL编码);

      取得flag(干杯~);

     

      第二十八题:综合题

     

      可以看出应该是一段JS代码,放到控制台运行一下;

      得到一个PHP文件名,尝试访问;

      TIP在脑袋里,应该会有信息在HTTP头部,查看burp;

      提示history of bash,而Linux系统的.bash_history文件里是系统输入的命令记录,尝试访问.bash_history文件;

      命令历史显示用了zip压缩命令,压缩后的文件名为flagbak.zip,尝试访问;

      提示下载,下载解压后里面是flag.txt文件,打开;

     

      取得flag(干杯~);

     

      第三十题:SQL注入2

     

      查看Source;

      代码分析:

      if判断处对$pass和$query[pw]的值进行了比较,需要二者相等;而$pass的值是我们输入的密码的md5的值,$query[pw]的值按理来说是我们输入的user的值在ctf表中对应的pw列的值;

      思路:运用union,当前者查询不存在的时候会返回后者的值,那么我们只用构造一个取得和我们输入的密码的MD5值相等的值即可成功;

      尝试构造user=’union select md5(111)#,pass=111

     

     

      取得flag(干杯~);

      未完待续~

  • 相关阅读:
    C++11 学习笔记 std::function和bind绑定器
    vue服务端渲染如何使用html模板
    vue服务端渲染的基本实现
    vscode实用6款插件
    $router.addRoutes()+vuex 动态添加路由
    Vue.extend()
    vue router滚动行为scrollBehavior
    vue路由精确匹配模式 exact
    redirect和alias的区别
    vue命名路由(name)的作用
  • 原文地址:https://www.cnblogs.com/Dio-Hch/p/11951290.html
Copyright © 2011-2022 走看看