Pages

Pages

Jan 17, 2009

謎の文字列を変換するpythonスクリプト


ちまたで噂のSQLインジェクションで埋め込まれるという謎の文字列。気になってたんだけどXORで解けるというのを発見した方がいて、胸のつかえがとれた気がします。平文←→謎文字列の変換スクリプトを書いたので載せておきます。



#!/usr/bin/env python
# -*- coding: utf-8 -*-
u'''
sqlxor.py
謎文字列解読スクリプト
修正の必要が *もしあれば* http://d.hatena.ne.jp/kkomiyama/20090117に載せるように
します。
解説:
ord(i): 対象文字をascii文字コードに変換
mg[enum%10] : 2番目、12番目、22番目のiにはmgリストの2番目を当てがう
chr ( ord(i) ^ mg[enum%10] ) : 上記2つのXORを取得した後、文字コードを文字に変換
pythonのリスト内包表記(list comprehension)を使って書いてます。シンプルにやるな

--
for enum,i in enumerate(t_plain):
t= chr ( ord(i) ^ mg[enum%10] )
t_crypt.append(t)
--
となります。
'''
import sys
mg=(0,1,2,3,4,4,6,4,1,9)
def crypt(t_plain) :
print "Before: " , t_plain
t_crypt=[ chr(ord(i) ^ mg[enum%10]) for enum,i in enumerate(t_plain)]
print "Result: " , ''.join(t_crypt)
def main() :
if len(sys.argv) == 1:
print "Error. Please specify strings to process."
print "Usage:", sys.argv[0] , " Strings_to_convert"
else:
crypt(sys.argv[1])
if __name__ =='__main__':
main()

使用方法


上のソースをコピって、適当な名前に保存。tekitou.py "<変換したい文字列>”で変換できるはず。平文なら謎文字列に、謎文字列なら平文に変換します。



[MB] sparky[~/bin]: ./sqlxor.py http://blog.sparky.jp
Before: http://blog.sparky.jp
Result: huvs>+)fmfg/qsevm}/cp

Shellにもよるんですが、引数は”(ダブルクォート)、’(シングルクォート)あるいは個別にエスケープする必要があります。多分。


うーん


攻撃者の真の狙いはなんだろね。今のところ韓国と日本が集中的に狙われているみたいだけど。



関連

http://d.hatena.ne.jp/callee/20090116/p1


http://d.hatena.ne.jp/harupu/20090116#p1


http://yamagata.int21h.jp/d/?date=20090116#p01


http://d.hatena.ne.jp/hasegawayosuke/20090116/p1