소스코드를 읽기 전 uid로 guest와 admin을 넣어보았다.
그랬더니 guest는 출력이 잘 되지만 admin은 block 되었다는 것을 알 수 있다.
소스코드를 뒤져보니
결국 uid를 받아와 sql 구문을 실행시키고, 여러 키워드를 사용하지 못하게 막는 함수가 존재했다.
하지만 keywords의 구분을 보니 대소문자 구분이 없었고, 공백 또한 white space만을 막는 것으로 보아 %09와 같은 tab 문자를 사용할 수 있을 것이라고 판단했다.
그래서 입력한 코드는 아래와 같다.
Admin' #
역시 출력이 잘 되는 것으로 보아 위의 입력을 변형시켜 upw의 값을 얻어오면 될 것이다.
그래서 작성한 코드
'Union Select upw From user where uid="Admin"#
하지만 위의 코드로는 아래와 같이 Error 500이 출력되었다.
그 이유인 즉슨, union을 사용하기 위해서는 select 구문의 column 개수가 앞의 select 구문 column 개수와 일치해야하는데, 생각없이 column을 하나만 사용했기에 발생한 에러였다.
그래서 column 개수가 몇개인지 확인하기 위해 null값을 넣어주며 알아낼 수 있으나,
애초에 idx, uid, upw 이 세 가지의 column이 존재한다는 것을 코드로 보여줬으므로 쉽게 해결할 수 있다.
그래서 column 개수와 column명에 맞게 작성한 코드
'Union Select idx,uid,upw From user where uid="Admin"#
주어진 코드에서 result=result[1]을 출력하므로
가운데에 원하는 upw를 넣어서 문제를 해결해주면 된다.
아래는 가운데에 idx를 넣어준 결과이다.
'Union Select null,idx,upw From user where uid="Admin"#