webhacking/sql, sql injection

sqli관련 작은 팁

qkqhxla1 2015. 9. 28. 19:44

워게임 문제풀려고 이것저것 찾다가 발견.

http://raz0r.name/other/phdays-2013-ctf-blade-writeup/

<?php
include 'flag.php';
 
if(!isset($_POST['username']) || !isset($_POST['password'])) {
    print <<<FORM
<form method=POST>
<input type=text name=username></input>
<input type=password name=password></input>
<input type=submit></input>
</form>
FORM;
    die;
}
 
$this_is_baaad = array("union", "select", "from", "where", "join", "sleep", "benchmark", ",", "(", ")");
foreach($this_is_baaad as $srsly) {
    if(stripos($_POST['username'], $srsly) !== false) {
        print "Do not try to trick me!";
        die;
    }
}
 
$q = mysql_query("SELECT * FROM users WHERE username = '{$_POST['username']}'");
if(mysql_num_rows($q) == 1) {
    $user = mysql_fetch_array($q);
    if($user['password'] == $_POST['password']) {
        print $flag;
    } else {
        print "Login failed!";
    }
} else {
    print "Login failed!";
}

문제 소스다. 


풀이.

if문에서 password검사를 ==으로 한다. if($user['password'] == $_POST['password']) 그러므로

group by구문에서의 with rollup을 쓰면 된다고 한다.

mysql> select * from employee;

+-------+---------+-------+---------+----------+------+

| EMPNO | EMPNAME | TITLE | MANAGER | SALARY   | DNO  |

+-------+---------+-------+---------+----------+------+

|  2106 | 김창섭  | 대리  |    1003 |  2500000 |    2 |

|  3426 | 박영권  | 과장  |    4377 |  3000000 |    1 |

|  3011 | 이수민  | 부장  |    4377 |  4000000 |    3 |

|  1003 | 조민희  | 과장  |    4377 |  3000000 |    2 |

|  3427 | 최종철  | 사원  |    3011 |  1500000 |    3 |

|  1365 | 김상원  | 사원  |    3426 |  1500000 |    1 |

|  4377 | 이성래  | 사장  |       0 |  5000000 |    2 |

|  1000 | hacker  | emp   |       0 | 99999999 |    9 |

|  2106 | 김창섭  | 대리  |    1003 |  2000000 |    2 |

+-------+---------+-------+---------+----------+------+

9 rows in set (0.05 sec)



mysql> select * from employee group by salary with rollup;

+-------+---------+-------+---------+----------+------+

| EMPNO | EMPNAME | TITLE | MANAGER | SALARY   | DNO  |

+-------+---------+-------+---------+----------+------+

|  3427 | 최종철  | 사원  |    3011 |  1500000 |    3 |

|  2106 | 김창섭  | 대리  |    1003 |  2000000 |    2 |

|  2106 | 김창섭  | 대리  |    1003 |  2500000 |    2 |

|  3426 | 박영권  | 과장  |    4377 |  3000000 |    1 |

|  3011 | 이수민  | 부장  |    4377 |  4000000 |    3 |

|  4377 | 이성래  | 사장  |       0 |  5000000 |    2 |

|  1000 | hacker  | emp   |       0 | 99999999 |    9 |

|  1000 | hacker  | emp   |       0 |     NULL |    9 |

+-------+---------+-------+---------+----------+------+

8 rows in set (0.00 sec)


널값이 나오므로 limit으로 널값을 뽑아와서 ==비교하게 하면 true가 된다고 한다.


with rollup 참조 : http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html