워게임 문제풀려고 이것저것 찾다가 발견.
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
'webhacking > sql, sql injection' 카테고리의 다른 글
Lord Of SQLinjection2 Gremlin~ing (0) | 2015.11.20 |
---|---|
codeshell.kr adm1nkyj board (0) | 2015.08.28 |
새로 찾아낸 error based sql injection( >5.5 ) (0) | 2015.08.26 |
WeChall Table Names, Table Names II, Order By Query (0) | 2015.08.15 |
adm1nkyj님 워게임 prob 6 (codeshell.kr union sqli?) (0) | 2015.08.13 |