手工SQL注入到底怎么用来偷看数据库里面到底藏了啥东西?
- 问答
- 2026-01-14 01:07:50
- 4
手工SQL注入,说白了,就是利用网站程序在处理你和数据库“对话”时的马虎大意,让你能偷偷修改“对话”的内容,从而套出本不该让你看到的信息,这就像你去图书馆问管理员:“请给我找一本叫《XXX》的书。”正常情况下,管理员会去书架上找这本书,但如果这个管理员是个死脑筋,只会照搬你的话去执行,而你又狡猾地说:“请把《XXX》这本书拿来,顺便把整个图书馆所有书的名字都念给我听。”这个糊涂管理员如果真照做了,你就得逞了,SQL注入就是这个道理,只不过对话的对象是网站后台的数据库。
要干这件事,首先得找到一个能让你“说话”的地方,任何你可以向网站提交数据的地方都可能是入口,比如登录框、搜索框、商品ID号(显示在网页地址栏里的那种,比如product.php?id=1)、留言板等等,这些地方背后,网站的程序员通常会写一条SQL指令,把你输入的内容填进去,然后发给数据库,比如在搜索框里,你输入“苹果”,程序生成的指令可能就是:“SELECT * FROM products WHERE name = '苹果'”,这条指令的意思是:从商品表里选出所有名字是“苹果”的记录。
关键漏洞就出在那些引号、等号这些用来拼接你输入内容的地方,如果我们输入的不是一个正常的词,而是一段精心设计的、带有特殊符号的“恶意”内容,就有可能改变整个指令的结构,最经典的测试就是输入一个单引号 ,比如在搜索框输入 然后回车,如果网站没有防注入措施,程序生成的指令就变成了:“SELECT * FROM products WHERE name = '''”,这条指令多了一个引号,语法错误,数据库看不懂,就会报错,这时,如果网站很“诚实”地把错误信息直接显示在网页上(比如提示“数据库语法错误 near '''”),那就等于告诉你:“喂,我这里有SQL注入漏洞哦!”这就叫基于错误的注入。
确认漏洞存在后,下一步就是试探数据库的结构,我们的目标是“偷看”,所以得先知道数据库里有哪些“抽屉”(表)和“格子”(列),这里要用到一个叫“UNION”的命令,UNION可以把两条查询的结果合并在一起显示,但前提是,两条查询选取的列数必须一样多,我们得先猜一猜原来的查询语句到底选了多少列。
方法就是不停地用“ORDER BY”来试,原来的网址是news.php?id=1,我们就在地址栏里把id的值改成:news.php?id=1 ORDER BY 1,这条指令的意思是:按照第一列来排序,如果页面正常显示,说明查询结果至少有一列,然后我们改成ORDER BY 2,ORDER BY 3……直到页面突然出错,或者显示不正常了,比如ORDER BY 5正常,ORDER BY 6出错,那就说明原来的查询语句一共选了5列,这一步就像你在试一把锁的钥匙,一把一把地试,直到找到能插进去的那几把。
知道了列数,比如是5列,我们就可以祭出UNION大法了,我们把网址改成:news.php?id=-1 UNION SELECT 1,2,3,4,5,这里把id设为-1,是因为通常没有id为-1的新闻,这样原本的查询(SELECT ... WHERE id=-1)就会返回空结果,网页上原本显示新闻内容的地方就空出来了,然后UNION后面的SELECT 1,2,3,4,5的结果就会填补这个空位,显示在网页上,这时你观察网页,会发现原本显示新闻标题、发布时间的地方,可能变成了数字“2”和“4”,这说明网页的第二个和第四个位置,会显示我们查询出来的数据,这太重要了!这意味着我们可以把想偷看的数据,放到这两个位置上显示出来。
我们就可以开始真正“偷看”了,数据库本身有个“档案室”,里面存放着所有数据库、表、列的名字,在不同的数据库软件(如MySQL、SQL Server)里,这个“档案室”的结构略有不同,以常见的MySQL为例,这个“档案室”通常叫information_schema,里面有一张很重要的表叫tables,它记录了所有表的名字。
我们把刚才的指令里的数字,换成我们想查询的内容,我们让第二个显示位来显示所有表名,网址就变成:news.php?id=-1 UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables,这时,网页上第二个显示位可能就会冒出一大串表名,比如users, products, admin等等,你一眼就看到了users和admin,这里面很可能就藏着用户名和密码。
我们想知道users这个表里有哪些列,再去查询“档案室”里另一张叫columns的表,网址改成:news.php?id=-1 UNION SELECT 1,column_name,3,4,5 FROM information_schema.columns WHERE table_name='users',这下,网页上可能会显示出user_id, username, password, email这些列名。
就是收获的时刻了,我们直接查询users表里的敏感信息,网址改成:news.php?id=-1 UNION SELECT 1,username,password,4,5 FROM users,这时,网页上就会清晰地列出所有用户名和它们对应的密码,如果密码是明文存储的(非常糟糕的做法),你就直接看到了,但通常密码会被加密成一串乱七八糟的字符(哈希值),这时你可能还需要用其他工具来破解这串密码。
就是手工SQL注入偷看数据库的基本思路和步骤,整个过程就像一场循序渐进的侦探游戏,通过不断试探、利用错误信息、联合查询,一步步从知道有漏洞,到摸清数据库结构,最终把核心数据偷到手,需要强调的是,这只是为了让你理解其原理,实际操作这种行为是违法的,千万不要对任何非你授权的网站进行尝试。

本文由称怜于2026-01-14发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/80253.html
